<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-25T23:13:41.613560" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-gate-userfeatures-netty.txt">
<suite id="s1-s1" name="Ready" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready">
<suite id="s1-s1-s1" name="Netconfready" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.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-04-25T23:13:42.283169" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:42.278773" elapsed="0.004465"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:13:42.278269" elapsed="0.005060"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.288637" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:13:42.284818" elapsed="0.003870"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:13:42.288931" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:42.288805" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.288769" elapsed="0.000244"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.289586" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:42.289186" elapsed="0.000447"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.290158" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:13:42.289826" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:13:42.290787" elapsed="0.000305"/>
</kw>
<msg time="2026-04-25T23:13:42.291205" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:42.291254" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:42.290366" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.291866" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:42.291455" elapsed="0.000439"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.293540" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:42.293260" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.294123" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:42.293739" elapsed="0.000411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.294661" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.294311" elapsed="0.000391"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.298017" elapsed="0.000243"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.298767" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:42.298419" elapsed="0.000374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.298945" elapsed="0.000290"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.300076" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:42.299776" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:13:42.300149" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:13:42.300324" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:42.299443" elapsed="0.000905"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:42.301047" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfe3f98d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:13:42.300570" elapsed="0.000660"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.301393" 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-04-25T23:13:42.297324" elapsed="0.004322"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:42.297128" elapsed="0.004583"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:13:42.294770" elapsed="0.007043"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.302400" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:42.301987" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.303028" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:42.302604" elapsed="0.000466"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.303628" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:42.303231" elapsed="0.000455"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:13:42.292784" elapsed="0.010962"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:13:42.284421" elapsed="0.019381"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:42.303986" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:42.303869" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.303849" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.307379" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:42.306993" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.307879" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:42.307562" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:42.307949" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:13:42.308110" 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-04-25T23:13:42.306650" 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-04-25T23:13:42.309149" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.308877" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.310028" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

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

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.314548" elapsed="0.000777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.316233" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:42.315593" elapsed="0.000794"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.317554" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.316657" elapsed="0.000994"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.319238" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:13:42.319326" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:13:42.318789" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.319627" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.321097" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:13:42.689990" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:13:40 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   10.7% of 77.35GB   Users logged in:       0
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:13:42.320692" elapsed="0.369436"/>
</kw>
<msg time="2026-04-25T23:13:42.690217" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.320255" elapsed="0.370067"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:13:42.318067" elapsed="0.372483"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.691440" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:13:42.704407" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:13:42.705115" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:13:42.705435" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:13:42.690963" elapsed="0.014695"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.706310" elapsed="0.001297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.710109" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:42.708920" elapsed="0.001527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:13:42.711556" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:42.710828" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.710701" elapsed="0.001039"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:13:42.712144" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-25T23:13:42.711882" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.711841" elapsed="0.000487"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:13:42.712422" elapsed="0.000017"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.716077" elapsed="0.000402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.716746" elapsed="0.000238"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.717227" elapsed="0.000161"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:42.713021" elapsed="0.004447"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:13:42.311991" elapsed="0.405819"/>
</kw>
<msg time="2026-04-25T23:13:42.717930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.311327" elapsed="0.406661"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:13:42.310846" elapsed="0.407224"/>
</kw>
<msg time="2026-04-25T23:13:42.718113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.310315" elapsed="0.407847"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.720890" elapsed="0.000320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.721434" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.721818" elapsed="0.000103"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:42.718454" elapsed="0.003519"/>
</kw>
<msg time="2026-04-25T23:13:42.722066" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:13:42.309387" elapsed="0.412704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.722518" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:42.722263" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:13:42.722603" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:13:42.308494" elapsed="0.414262"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:42.308319" elapsed="0.414475"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:42.308187" elapsed="0.414653"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:13:42.304276" elapsed="0.418628"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:13:42.723058" elapsed="0.000230"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:42.737214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:42.737073" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.737053" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.737589" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.737438" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.738166" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:42.737898" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:42.738610" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:42.738363" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:42.739452" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:13:42.739197" elapsed="0.000530">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:13:42.739844" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:42.739891" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:42.738828" elapsed="0.001086"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:42.740238" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:42.739993" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:42.739973" elapsed="0.000373"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:42.741139" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.740856" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:42.741213" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:13:42.741386" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:42.740552" elapsed="0.000858"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.741569" elapsed="0.000447"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.742312" level="INFO">index=4
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.742186" elapsed="0.000265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.742602" elapsed="0.002487"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:42.745597" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:42.746716" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:42.745306" elapsed="0.003237">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:42.751761" elapsed="0.000409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:42.752335" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:42.752650" elapsed="0.000134"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:42.749415" elapsed="0.003424"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:42.748875" elapsed="0.004012"/>
</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="FAIL" start="2026-04-25T23:13:42.736789" elapsed="0.016195">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:43.771577" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:43.771419" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:43.771387" elapsed="0.000298"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:43.772091" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:43.771882" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:43.772733" level="INFO">{1: 4}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:43.772396" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:43.773170" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:43.772928" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:43.773787" elapsed="0.000187"/>
</kw>
<msg time="2026-04-25T23:13:43.774078" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:43.774123" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:43.773382" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:43.775010" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:43.775894" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:43.775701" elapsed="0.000898">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:43.775354" elapsed="0.001403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:43.777253" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:43.776926" elapsed="0.000525"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:43.774464" elapsed="0.003034"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:43.774221" elapsed="0.003325"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:43.774203" elapsed="0.003369"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:43.778339" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:43.778070" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:43.778412" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:13:43.778582" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:43.777794" elapsed="0.000812"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:43.778843" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:43.779539" level="INFO">index=6
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:43.779432" elapsed="0.000251"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:43.779833" elapsed="0.002473"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:43.782771" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:43.783864" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:43.782467" elapsed="0.001779">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:43.787282" elapsed="0.000396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:43.787839" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:43.788127" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:43.785084" elapsed="0.003189"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:43.784532" elapsed="0.003786"/>
</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="FAIL" start="2026-04-25T23:13:43.770998" elapsed="0.017404">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:44.808323" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:44.808160" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:44.808131" elapsed="0.000292"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:44.808846" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:44.808620" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:44.809490" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:44.809162" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:44.809952" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:44.809705" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:44.810542" elapsed="0.000209"/>
</kw>
<msg time="2026-04-25T23:13:44.810861" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:44.810910" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:44.810156" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:44.811782" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:44.812718" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:44.812500" elapsed="0.000888">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:44.812151" elapsed="0.001371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:44.814032" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:44.813707" elapsed="0.000527"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:44.811227" elapsed="0.003054"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:44.811007" elapsed="0.003404"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:44.810988" elapsed="0.003450"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:44.815208" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:44.814937" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:44.815281" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:13:44.815439" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:44.814643" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:44.815632" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:44.816392" level="INFO">index=8
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:44.816272" elapsed="0.000254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:44.816716" elapsed="0.002427"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:44.819569" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:44.820648" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:44.819306" elapsed="0.001745">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:44.824152" elapsed="0.000421"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:44.824753" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:44.825051" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:44.821911" elapsed="0.003297"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:44.821343" elapsed="0.003911"/>
</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="FAIL" start="2026-04-25T23:13:44.807723" elapsed="0.017616">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.844642" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.844472" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.844444" elapsed="0.000320"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.845169" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.844964" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.845799" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.845479" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.846234" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.845992" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.846846" elapsed="0.000184"/>
</kw>
<msg time="2026-04-25T23:13:45.847151" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:45.847207" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.846437" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:45.848088" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.849064" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.848887" elapsed="0.000822">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.848522" elapsed="0.001323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.850373" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.850015" elapsed="0.000566"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:45.847558" elapsed="0.003071"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:45.847322" elapsed="0.003378"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.847300" elapsed="0.003427"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:45.851527" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.851250" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:45.851605" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:13:45.851784" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.850935" elapsed="0.000874"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.851964" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.852675" level="INFO">index=10
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.852553" elapsed="0.000296"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.852998" elapsed="0.002537"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.855988" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:45.857020" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.855718" elapsed="0.001713">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:45.860895" 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-04-25T23:13:45.861468" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.861788" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.858292" elapsed="0.003651"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:45.857755" elapsed="0.004233"/>
</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="FAIL" start="2026-04-25T23:13:45.844024" elapsed="0.018051">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:45.862171" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:13:42.724060" elapsed="3.138206">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:42.723680" elapsed="3.138653"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:42.723520" elapsed="3.138856"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:13:42.723354" elapsed="3.139062"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:13:42.283745" elapsed="3.578739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.865254" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.865141" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.865121" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.870400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.870283" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.870264" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.871467" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:45.871047" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.871983" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:45.871662" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:45.872055" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:13:45.872212" 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-04-25T23:13:45.870711" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.877797" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.877687" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.877656" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.879169" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.878988" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.878969" elapsed="0.000339"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:45.879937" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.879458" elapsed="0.000523"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.880461" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:45.880218" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.882525" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.882096" elapsed="0.000980">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:45.883240" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:13:45.883316" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.880748" elapsed="0.002609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.885583" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.885035" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:45.886339" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:13:45.886416" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.883655" elapsed="0.002800"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.887647" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.886983" elapsed="0.000915">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:45.886620" elapsed="0.001425">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:45.886598" elapsed="0.001500">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:45.888262" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:45.888604" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:45.888426" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:45.888406" elapsed="0.000431"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.888876" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:45.890796" elapsed="0.000325"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.891328" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.891879" 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-04-25T23:13:45.890081" elapsed="0.002012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:45.889154" elapsed="0.003034"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.878603" elapsed="0.013672">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</status>
</kw>
<msg time="2026-04-25T23:13:45.892385" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:45.892430" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/ready/netconfready.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.878010" elapsed="0.014444"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.892642" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.892533" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.892513" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.893517" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.893407" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.893388" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.894032" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.893751" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.894601" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.894315" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.895100" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.894828" 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-04-25T23:13:45.895769" elapsed="0.000362"/>
</kw>
<msg time="2026-04-25T23:13:45.896299" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:45.896348" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.895303" elapsed="0.001069"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:45.897550" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.899025" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.898865" elapsed="0.000599">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.898160" elapsed="0.001392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.900690" 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-04-25T23:13:45.899991" elapsed="0.000875"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:45.896686" elapsed="0.004263"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:45.896450" elapsed="0.004553"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.896430" elapsed="0.004599"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:45.902036" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.901524" elapsed="0.000540"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:45.902153" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:13:45.902346" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.901230" elapsed="0.001142"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.902527" elapsed="0.000662"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.903467" level="INFO">index=13
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.903359" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.903788" elapsed="0.013899"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.918168" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:45.919041" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.917854" elapsed="0.001567">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:45.923161" elapsed="0.001065"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.924489" elapsed="0.000433"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.925169" elapsed="0.000297"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.920547" elapsed="0.005009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:45.919991" elapsed="0.005619"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.893155" elapsed="0.032559">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:45.926099" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.926176" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.877380" elapsed="0.048903">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:45.926391" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:45.926435" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.872634" elapsed="0.053824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:45.926825" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:45.926536" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.926518" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:45.872491" elapsed="0.054440"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:45.872297" elapsed="0.054667"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:13:45.869988" elapsed="0.057033"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:13:45.863150" elapsed="0.063926"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.862713" elapsed="0.064405"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:13:42.277903" elapsed="3.649271"/>
</kw>
<kw name="Set_Netconf_Connector">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.927950" level="INFO">${streamconnector} = /node/controller-config/yang-ext:mount/config:modules/module/sal-restconf-service:json-restconf-service-impl/json-restconf-service-impl</msg>
<var>${streamconnector}</var>
<arg>/node/controller-config/yang-ext:mount/config:modules/module/sal-restconf-service:json-restconf-service-impl/json-restconf-service-impl</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:45.927638" elapsed="0.000374"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.930449" level="INFO">${connector} = </msg>
<var>${connector}</var>
<arg>${USE_NETCONF_CONNECTOR}</arg>
<arg>${streamconnector}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:45.928216" elapsed="0.002260"/>
</kw>
<return>
<value>${connector}</value>
<status status="PASS" start="2026-04-25T23:13:45.930528" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:13:45.930701" level="INFO">${connector} = </msg>
<var>${connector}</var>
<doc>Sets netconf connector verify url according to the titanium and False combination</doc>
<status status="PASS" start="2026-04-25T23:13:45.927402" elapsed="0.003333"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.935598" level="INFO">${netconf_connector} = </msg>
<arg>${netconf_connector}</arg>
<arg>${connector}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:45.930905" elapsed="0.004739"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>A workaround for EOF error follows. TODO: Create a test case for the EOF bug, possibly tagged "exclude".</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:13:45.935884" elapsed="0.000241"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:45.950640" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:45.950527" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.950509" elapsed="0.000215"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.951004" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.950872" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.951548" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.951289" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:45.952001" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:45.951757" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.952629" elapsed="0.000201"/>
</kw>
<msg time="2026-04-25T23:13:45.952927" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:45.952973" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.952199" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:45.953802" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.954571" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.954419" elapsed="0.000595">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.954097" elapsed="0.000979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.955570" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:45.955241" elapsed="0.000488"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:45.953287" elapsed="0.002486"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:45.953069" elapsed="0.002752"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:45.953051" elapsed="0.002795"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:45.956766" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.956402" elapsed="0.000391"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:45.956840" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:13:45.956999" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.956054" elapsed="0.000969"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.957188" elapsed="0.000395"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.957879" level="INFO">index=15
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.957773" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.958159" elapsed="0.003749"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:45.962366" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:45.963246" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.962106" elapsed="0.001511">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:45.966746" elapsed="0.000312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:45.967219" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:45.967515" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:45.964496" elapsed="0.003189"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:45.963920" elapsed="0.003828"/>
</kw>
<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="FAIL" start="2026-04-25T23:13:45.948811" elapsed="0.019022">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:46.988592" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:46.988448" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:46.988421" elapsed="0.000275"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:46.989046" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:46.988866" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:46.989650" level="INFO">{1: 15}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:46.989347" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:46.990117" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:46.989868" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:46.990875" elapsed="0.000186"/>
</kw>
<msg time="2026-04-25T23:13:46.991163" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:46.991208" level="INFO">${old_connection_index} = 15</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:46.990445" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:46.992059" elapsed="0.000137"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:46.992874" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:46.992698" elapsed="0.000681">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:46.992359" elapsed="0.001083"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:46.993952" 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-04-25T23:13:46.993611" elapsed="0.000487"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:46.991530" elapsed="0.002614"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:46.991308" elapsed="0.002885"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:46.991289" elapsed="0.002930"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:46.995053" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:46.994780" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:46.995126" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:13:46.995281" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:46.994470" elapsed="0.000836"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:46.995528" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:46.996234" level="INFO">index=17
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:46.996129" 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-04-25T23:13:46.996510" elapsed="0.002635"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:46.999577" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:47.000753" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:46.999310" elapsed="0.001838">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.004337" elapsed="0.000321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.004834" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.005140" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.002001" elapsed="0.003295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:47.001433" elapsed="0.003909"/>
</kw>
<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="FAIL" start="2026-04-25T23:13:46.986622" elapsed="0.018802">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:47.005510" level="FAIL">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>2x</arg>
<arg>1s</arg>
<arg>KarafKeywords.Open_Controller_Karaf_Console_On_Background</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-25T23:13:45.936288" elapsed="1.069316">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<arg>Starting Netconf readiness test suite</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.010145" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${DEBUG_LOGGING_FOR_EVERYTHING}">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>log:set DEBUG</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.010617" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.010247" elapsed="0.000447"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:47.010228" elapsed="0.000492"/>
</if>
<kw name="Create Session" owner="RequestsLibrary">
<arg>ses</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.010865" elapsed="0.000023"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.011149" elapsed="0.000026"/>
</kw>
<doc>Initialize SetupUtils. Setup requests library and log into karaf.log that the netconf readiness wait starts.</doc>
<status status="FAIL" start="2026-04-25T23:13:42.277452" elapsed="4.733813">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<test id="s1-s1-s1-t1" name="Check_Whether_Netconf_Topology_Is_Ready" line="84">
<doc>Checks netconf readiness.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.011352" elapsed="0.000494">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s1-s1-t2" name="Wait_For_Netconf_Connector" line="97">
<doc>Wait for the Netconf to go up for configurable time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:13:47.012052" elapsed="0.000406">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s1-s1-t3" name="Wait_Even_Longer" line="105">
<doc>Bugs such as 7175 may require to wait longer till netconf-connector works.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:13:47.012643" elapsed="0.000414">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s1-s1-t4" name="Check_For_Bug_5014" line="114">
<doc>If Netconf appears to be down, it may be due to bug 5014. Check if it is so and fail if yes.
Bug 5014 is about Netconf playing dead on boot until a device
configuration request is sent to it. To uncover this attempt to
configure and then deconfigure a device and then check if Netconf
is now up and running. If that turns out to be true, fail the case
as this signifies the bug 5014 to be present. Skip this testcase
if Netconf is detected to be up and running.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:13:47.013246" elapsed="0.001130">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s1-s1-t5" name="Check_Whether_Netconf_Can_Pretty_Print" line="132">
<doc>Make one request to netconf-connector and see if it works.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:13:47.014640" elapsed="0.000451">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s1-s1-t6" name="Wait_For_MDSAL" line="141">
<doc>Wait for the MDSAL feature to become online</doc>
<status status="FAIL" start="2026-04-25T23:13:47.015275" elapsed="0.000315">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.022955" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.022840" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.022821" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.024154" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:47.023588" elapsed="0.000604"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.024851" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:47.024412" elapsed="0.000475"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:47.024949" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:13:47.025164" 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-04-25T23:13:47.023255" elapsed="0.001943"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.032548" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.032441" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.032422" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.033656" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.033542" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.033525" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.034132" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.033904" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.034487" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:47.034316" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.035271" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.035067" elapsed="0.000675">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:47.035862" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:13:47.035911" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.034710" elapsed="0.001225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.036641" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.036445" elapsed="0.000717">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:47.037272" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:13:47.037318" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.036103" elapsed="0.001238"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.037992" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.037635" elapsed="0.000420">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:47.037416" elapsed="0.000702">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:47.037397" elapsed="0.000788">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.038810" level="INFO">Cannot open session, you need to establish a connection first.</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.038348" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.039485" level="FAIL">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</msg>
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.039163" elapsed="0.000383">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:47.038945" elapsed="0.000664">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:47.038924" elapsed="0.000719">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-25T23:13:47.039709" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.040861" elapsed="0.000391"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.041416" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.041736" elapsed="0.000103"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.040525" elapsed="0.001366"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:47.040016" elapsed="0.001921"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.033293" elapsed="0.008796">Several failures occurred:

1) Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"

2) Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<msg time="2026-04-25T23:13:47.042192" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:47.042236" level="INFO">${message} = Several failures occurred:

1) Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"

2) Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Endi...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.032783" elapsed="0.009478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.042447" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.042339" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.042319" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.043519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.043409" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.043391" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.043909" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.043763" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.044470" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.044210" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.044939" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.044682" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.045515" elapsed="0.000202"/>
</kw>
<msg time="2026-04-25T23:13:47.045817" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:47.045865" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.045152" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:47.046720" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.047698" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.047514" elapsed="0.000645">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.047181" elapsed="0.001047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.048740" elapsed="0.000138"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.048397" elapsed="0.000530"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:47.046190" elapsed="0.002782"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:47.045964" elapsed="0.003058"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.045946" elapsed="0.003103"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.049838" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.049540" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:47.049914" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:13:47.050069" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.049263" elapsed="0.000831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.050257" elapsed="0.000420"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.051007" level="INFO">index=20
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.050882" elapsed="0.000265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.051302" elapsed="0.002425"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.054156" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:47.055138" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.053891" elapsed="0.001627">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.058595" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.059117" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.059412" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.056329" elapsed="0.003239"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:47.055816" elapsed="0.003798"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.043127" elapsed="0.016601">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.060430" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.060318" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.060299" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.060889" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.060649" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.061239" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:47.061071" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.061992" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.061790" elapsed="0.000632">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:47.062543" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:13:47.062591" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.061422" elapsed="0.001193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.063352" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.063158" elapsed="0.000757">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:47.064027" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:13:47.064074" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.062800" elapsed="0.001298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.064755" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.064398" elapsed="0.000418">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:47.064179" elapsed="0.000699">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:47.064158" elapsed="0.000755">Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.065322" level="INFO">Cannot open session, you need to establish a connection first.</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.065070" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.065999" level="FAIL">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</msg>
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.065676" elapsed="0.000384">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:47.065434" elapsed="0.000688">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:47.065415" elapsed="0.000742">Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-25T23:13:47.066203" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.067517" elapsed="0.000340"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.068021" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.068313" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.067199" elapsed="0.001267"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:47.066479" elapsed="0.002033"/>
</kw>
<msg time="2026-04-25T23:13:47.068708" level="INFO">${message} = Cannot open session, you need to establish a connection first.</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="FAIL" start="2026-04-25T23:13:47.060061" elapsed="0.008679">Several failures occurred:

1) Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"

2) Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-25T23:13:47.068800" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.032153" elapsed="0.036829">Several failures occurred:

1) NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206

2) Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"

3) Failed to see prompt after sending the command: log:log "ROBOT MESSAGE: Ending Netconf readiness test suite"</status>
</kw>
<msg time="2026-04-25T23:13:47.069084" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:47.069128" level="INFO">${output} = Several failures occurred:

1) NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206

2) Failed to send the command: log:log "ROBOT MESSAGE: Ending Netconf readiness te...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.025764" elapsed="0.043388"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.069482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.069231" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.069211" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:47.025538" elapsed="0.044044"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:47.025280" elapsed="0.044339"/>
</for>
<arg>Ending Netconf readiness test suite</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:13:47.020602" elapsed="0.049101"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:47.069934" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:13:47.069856" elapsed="0.000161"/>
</kw>
<doc>Destroy all sessions in the requests library and log into karaf.log that the netconf readiness wait is over.</doc>
<status status="PASS" start="2026-04-25T23:13:47.016096" elapsed="0.053974"/>
</kw>
<doc>netconf-connector readiness test suite.

Copyright (c) 2015,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


Try to detect whether Netconf is up and running and wait for
it for a configurable time if it is not yet up and running.

This is achieved by the test Check_Whether_Netconf_Topology_Is_Ready. This test case
does not use controller-config device. This test case is skipped (Pass Execution) if
the usage of controller-config device is indicated.
Testing itself is done by creating a netconf test device configured
to all odl nodes one by one and check if GET works from mounted
device. GET is done from all the odl nodes and it works for both, 1 or 3 nodes
setup.

The next test cases are basically dedicated to test readiness of the netconf using
controller-config device. This device is created when odl-netconf-connector-ssh|all
feature is installed. Robot variable USE_NETCONF_CONNECTOR should be set to True.
Connector test cases change behavior depending on False. If True,
they check data mounted behind controller-config is readable, if False they only check
topology-netconf is readable.

Some testsuites expect netconf-connector to be ready as soon as possible and will
fail if it is not. We want to see a failure if this is the cause of the failure.


The usage of netconf-connector happens in other suites than netconf,
especially bgpcep to configure odl's bgp peers. Testing the readiness
of the netconf-connector must be invoked by the Robot invocation
argument USE_NETCONF_CONNECTOR. By default it is set to False and
test jobs should be responsible to set it to True if needed. In the
default configuration the affected test cases waits for the netconf
topology to appear only.

If the netconf-connector is not ready upon startup and it's usage is set
to True (as seen by the second test case failing), the next case starts
to repeat the query for a minute to see whether it is going "to fix itself"
within the minute. If yes, then the testcase will pass, which
indicates that the "ODL cooldown" of 1 minute is not long enough
to allow for netconf-connector to initialize properly.
If this fails, one more check with even longer timeout is run.
If the Check_Whether_Netconf_Is_Up_And_Running pass, then the next test
case does nothing.

The other test case then checks whether Netconf can pretty print
data. This sometimes makes problems, most likely due to too
new Robot Requests library with an interface incompatible with
this test suite.</doc>
<status status="FAIL" start="2026-04-25T23:13:41.664281" elapsed="5.405854">Suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</suite>
<status status="FAIL" start="2026-04-25T23:13:41.663029" elapsed="5.407955"/>
</suite>
<suite id="s1-s2" name="Apidocs" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs">
<suite id="s1-s2-s1" name="Apidocs" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/apidocs.robot">
<kw name="Create_Default_Session" owner="TemplatedRequests" type="SETUP">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:47.119607" level="INFO">Creating Session using : alias=default, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfcd121d0&gt;, timeout=30, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:13:47.119206" elapsed="0.000568"/>
</kw>
<arg>timeout=30</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="PASS" start="2026-04-25T23:13:47.118826" elapsed="0.001021"/>
</kw>
<test id="s1-s2-s1-t1" name="Get Apidoc Apis" line="17">
<kw name="Run_Keyword_If_Less_Than_Titanium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_Less_Than" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt; ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.134406" elapsed="0.000426"/>
</kw>
<arg>titanium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to titanium and in case titanium is less than ${lower_bound},
run Skip_Netty_Test_Case ['Skipping test: Not valid for Netty-based RESTCONF on ODL versions Scandium and earlier.'] {} and return its value.</doc>
<status status="PASS" start="2026-04-25T23:13:47.133992" elapsed="0.000910"/>
</kw>
<msg time="2026-04-25T23:13:47.134950" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_Less_Than</arg>
<arg>titanium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.127423" elapsed="0.007577"/>
</kw>
<arg>Skip_Netty_Test_Case</arg>
<arg>Skipping test: Not valid for Netty-based RESTCONF on ODL versions Scandium and earlier.</arg>
<doc>Compare titanium to titanium and in case titanium is less than titanium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-25T23:13:47.127103" elapsed="0.007973"/>
</kw>
<kw name="Set_Variable_If_At_Least_Aluminium" 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-04-25T23:13:47.148812" elapsed="0.000423"/>
</kw>
<msg time="2026-04-25T23:13:47.149287" 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-04-25T23:13:47.148448" elapsed="0.000888"/>
</kw>
<arg>aluminium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return openapi_18 if titanium is at least ${lower_bound},
return apis otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.148104" elapsed="0.001306"/>
</kw>
<msg time="2026-04-25T23:13:47.149453" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>aluminium</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-04-25T23:13:47.141607" elapsed="0.007888"/>
</kw>
<msg time="2026-04-25T23:13:47.149597" level="INFO">${path} = openapi_18</msg>
<var>${path}</var>
<arg>openapi_18</arg>
<arg>apis</arg>
<doc>Compare aluminium to titanium and return ${value_if_true} if titanium is at least aluminium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.141328" elapsed="0.008293"/>
</kw>
<kw name="Set_Variable_If_At_Least_Chlorine" 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-04-25T23:13:47.163354" elapsed="0.000435"/>
</kw>
<msg time="2026-04-25T23:13:47.163840" 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-04-25T23:13:47.163038" elapsed="0.000872"/>
</kw>
<arg>chlorine</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return openapi if titanium is at least ${lower_bound},
return openapi_18 otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.162693" elapsed="0.001294"/>
</kw>
<msg time="2026-04-25T23:13:47.164030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>chlorine</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-04-25T23:13:47.156191" elapsed="0.007882"/>
</kw>
<msg time="2026-04-25T23:13:47.164175" level="INFO">${path} = openapi</msg>
<var>${path}</var>
<arg>openapi</arg>
<arg>${path}</arg>
<doc>Compare chlorine to titanium and return ${value_if_true} if titanium is at least chlorine, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.155879" elapsed="0.008319"/>
</kw>
<kw name="Set_Variable_If_At_Least_Potassium" 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-04-25T23:13:47.177839" elapsed="0.000424"/>
</kw>
<msg time="2026-04-25T23:13:47.178313" 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-04-25T23:13:47.177507" elapsed="0.000854"/>
</kw>
<arg>potassium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to titanium and return openapi_v3 if titanium is at least ${lower_bound},
return openapi otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.177161" elapsed="0.001274"/>
</kw>
<msg time="2026-04-25T23:13:47.178477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>potassium</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-04-25T23:13:47.170654" elapsed="0.007864"/>
</kw>
<msg time="2026-04-25T23:13:47.178619" level="INFO">${path} = openapi_v3</msg>
<var>${path}</var>
<arg>openapi_v3</arg>
<arg>${path}</arg>
<doc>Compare potassium to titanium and return ${value_if_true} if titanium is at least potassium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.170343" elapsed="0.008302"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.215684" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.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-04-25T23:13:47.215290" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:13:47.216393" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3.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-04-25T23:13:47.216126" elapsed="0.000337">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:13:47.216556" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:13:47.215835" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.217111" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:47.216725" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:13:47.217406" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:13:47.217565" level="INFO">${template} = /openapi/api/v3/single
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:13:47.217260" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.217970" level="INFO">/openapi/api/v3/single
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.217725" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.218918" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.218646" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.219347" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.219082" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.219692" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.219902" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.220035" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-25T23:13:47.219581" elapsed="0.000510"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.219429" elapsed="0.000693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:13:47.220168" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:13:47.220335" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:13:47.218354" elapsed="0.002005"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:47.218087" elapsed="0.002329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.220552" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.220443" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.218065" elapsed="0.002561"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.221183" level="INFO">${final_text} = /openapi/api/v3/single</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:13:47.220743" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:13:47.221257" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:13:47.214719" elapsed="0.006661"/>
</kw>
<msg time="2026-04-25T23:13:47.221432" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.205004" elapsed="0.016474"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.231132" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.240599" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.250129" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.250283" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.250416" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.250769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.250647" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:47.250630" elapsed="0.000217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.250946" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.251072" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.251246" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:13:47.250599" elapsed="0.000701"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.250493" elapsed="0.000833"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.251431" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.251505" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:13:47.251615" level="INFO">${uri} = /openapi/api/v3/single</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-25T23:13:47.201710" elapsed="0.049930"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:13:47.252824" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.252526" elapsed="0.000362">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:13:47.252981" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:13:47.252230" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.253282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.253077" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.253797" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:47.253486" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:47.253361" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.253059" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.255733" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:47.253988" elapsed="0.001771"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:13:47.255810" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:13:47.255962" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.251951" elapsed="0.004035"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:13:47.257090" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.256854" elapsed="0.000299">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/apidoc/openapi_v3/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-25T23:13:47.257247" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:13:47.256529" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-25T23:13:47.257475" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-25T23:13:47.257340" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.257322" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.257676" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.257809" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.257873" elapsed="0.000014"/>
</return>
<msg time="2026-04-25T23:13:47.259341" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:13:47.256252" elapsed="0.003114"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.260693" level="INFO">/openapi/api/v3/single</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.260431" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.261115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.260875" 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">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.262995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.261258" elapsed="0.001800"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:47.266264" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): 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>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.263183" elapsed="0.007817">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:47.263082" elapsed="0.008011">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:47.261239" elapsed="0.009887">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.271501" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.271644" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.271605" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:47.271583" 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-04-25T23:13:47.271833" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.271903" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.259644" elapsed="0.012362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.272093" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.185018" elapsed="0.087168">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.272443" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.272282" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:47.272260" elapsed="0.000283"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.272575" elapsed="0.000015"/>
</return>
<var>${resp}</var>
<arg>folder=${VAR_DIR}/${path}</arg>
<arg>http_timeout=90</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.181753" elapsed="0.090943">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${resp}</arg>
<arg>api</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.272861" elapsed="0.000024"/>
</kw>
<doc>Get the Apidoc Apis list, check 200 status and apis string presence.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.119903" elapsed="0.153131">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /openapi/api/v3/single (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-25T23:13:47.273508" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:13:47.273424" elapsed="0.000149"/>
</kw>
<doc>Test suite to verify Apidocs is OK.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.072754" elapsed="0.200851"/>
</suite>
<status status="FAIL" start="2026-04-25T23:13:47.071495" elapsed="0.202811"/>
</suite>
<suite id="s1-s3" name="MDSAL" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL">
<suite id="s1-s3-s1" name="Northbound" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.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-04-25T23:13:47.349404" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:47.345652" elapsed="0.003800"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:13:47.345382" elapsed="0.004160"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.353973" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:13:47.350633" elapsed="0.003368"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:13:47.354205" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.354084" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.354061" elapsed="0.000212"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.354790" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:47.354414" elapsed="0.000419"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.355295" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:13:47.354983" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:13:47.355814" elapsed="0.000282"/>
</kw>
<msg time="2026-04-25T23:13:47.356194" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:47.356239" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.355471" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.356799" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:47.356415" elapsed="0.000410"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.357867" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:47.357540" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.358282" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:47.358031" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.358758" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.358449" 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-04-25T23:13:47.361655" elapsed="0.000257"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.362385" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:47.362059" 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-04-25T23:13:47.362549" elapsed="0.000247"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.363547" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:13:47.363256" elapsed="0.000317"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:13:47.363618" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:13:47.363800" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.362978" elapsed="0.000846"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:47.364554" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfe3faad0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:13:47.363966" elapsed="0.000750"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.364872" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-25T23:13:47.361064" elapsed="0.004060"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:47.360887" elapsed="0.004282"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:13:47.358850" elapsed="0.006352"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.365815" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:47.365353" elapsed="0.000506"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.366458" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:47.366058" elapsed="0.000441"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.367052" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:47.366648" elapsed="0.000446"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:13:47.357068" elapsed="0.010085"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:13:47.350309" elapsed="0.016901"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.367388" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.367275" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.367255" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.370385" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:47.370008" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.370938" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:47.370571" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:47.371013" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:13:47.371174" 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-04-25T23:13:47.369613" elapsed="0.001585"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.372171" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.371909" elapsed="0.000288"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.372933" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

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

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.377069" elapsed="0.000817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.378798" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.378157" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.379958" 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-04-25T23:13:47.379210" elapsed="0.000846"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.381538" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:13:47.381616" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:13:47.381121" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.381891" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.383158" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:13:47.682295" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:13:40 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   10.7% of 77.35GB   Users logged in:       0
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:13:42 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:13:47.382832" elapsed="0.299574"/>
</kw>
<msg time="2026-04-25T23:13:47.682479" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.382463" elapsed="0.300090"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:13:47.380406" elapsed="0.302372"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.683527" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:13:47.695984" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:13:47.696427" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:13:47.696631" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:13:47.683095" elapsed="0.013698"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.697309" elapsed="0.001125"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.700883" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.699586" elapsed="0.001649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.702189" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.701559" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.701457" elapsed="0.001049"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:13:47.703393" elapsed="0.000135"/>
</return>
<status status="PASS" start="2026-04-25T23:13:47.702839" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.702750" elapsed="0.001087"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.704036" elapsed="0.000037"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.707614" elapsed="0.000413"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.708270" elapsed="0.000257"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.708962" elapsed="0.000166"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.705100" elapsed="0.004105"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:13:47.374877" elapsed="0.334577"/>
</kw>
<msg time="2026-04-25T23:13:47.709562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.374212" elapsed="0.335404"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:13:47.373715" elapsed="0.335996"/>
</kw>
<msg time="2026-04-25T23:13:47.709752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.373199" elapsed="0.336599"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.712188" elapsed="0.000358"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.712785" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.713073" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.710072" elapsed="0.003198"/>
</kw>
<msg time="2026-04-25T23:13:47.713363" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:13:47.372410" elapsed="0.340977"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.713818" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.713550" elapsed="0.000310"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:13:47.713903" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:13:47.371553" elapsed="0.342472"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:47.371380" elapsed="0.342682"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:47.371250" elapsed="0.342848"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:13:47.367677" elapsed="0.346477"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:13:47.714296" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:47.727316" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:47.727205" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.727185" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.727679" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.727529" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.728219" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.727957" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:47.728701" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:47.728403" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.729504" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.729276" elapsed="0.000336">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:13:47.729737" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:47.729782" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.728926" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:47.730091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:47.729880" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:47.729861" elapsed="0.000328"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:47.730926" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.730638" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:47.731001" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:13:47.731151" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.730378" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.731318" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.732019" level="INFO">index=26
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.731912" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.732281" elapsed="0.002054"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:47.734765" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:47.735817" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:47.734487" elapsed="0.001790">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:47.739241" elapsed="0.000380"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:47.739793" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:47.740071" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:47.737144" elapsed="0.003073"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:47.736546" elapsed="0.003717"/>
</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="FAIL" start="2026-04-25T23:13:47.726926" elapsed="0.013420">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:48.759412" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:48.759248" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:48.759221" elapsed="0.000280"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:48.759887" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:48.759696" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:48.760475" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:48.760177" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:48.760953" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:48.760701" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:48.761529" elapsed="0.000214"/>
</kw>
<msg time="2026-04-25T23:13:48.761848" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:48.761895" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:48.761153" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:48.762721" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:48.763545" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:48.763371" elapsed="0.001001">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:48.763058" elapsed="0.001449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:48.765032" 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-04-25T23:13:48.764710" elapsed="0.000520"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:48.762207" elapsed="0.003069"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:48.761994" elapsed="0.003330"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:48.761976" elapsed="0.003374"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:48.766100" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:48.765831" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:48.766179" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:13:48.766337" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:48.765545" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:48.766506" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:48.767257" level="INFO">index=28
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:48.767085" elapsed="0.000301"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:48.767523" elapsed="0.002199"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:48.770135" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:48.771173" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:48.769875" elapsed="0.001674">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:48.774354" elapsed="0.000401"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:48.774905" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:48.775184" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:48.772341" elapsed="0.002990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:48.771833" elapsed="0.003543"/>
</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="FAIL" start="2026-04-25T23:13:48.758853" elapsed="0.016605">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:49.794439" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:49.794297" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:49.794270" elapsed="0.000254"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:49.794891" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:49.794710" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:49.795478" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:49.795179" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:49.795952" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:49.795701" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:49.796512" elapsed="0.000202"/>
</kw>
<msg time="2026-04-25T23:13:49.796816" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:49.796863" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:49.796146" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:49.797684" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:49.798506" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:49.798337" elapsed="0.000806">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:49.798021" elapsed="0.001256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:49.799788" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:49.799435" elapsed="0.000555"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:49.797173" elapsed="0.002865"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:49.796963" elapsed="0.003124"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:49.796944" elapsed="0.003226"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:49.800922" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:49.800635" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:49.800996" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:13:49.801152" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:49.800371" 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-04-25T23:13:49.801320" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:49.802016" level="INFO">index=30
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:49.801910" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:49.802278" elapsed="0.002182"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:49.804893" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:49.805998" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:49.804610" elapsed="0.001762">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:49.809188" elapsed="0.000387"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:49.809744" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:49.810026" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:49.807160" elapsed="0.003015"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:49.806636" elapsed="0.003585"/>
</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="FAIL" start="2026-04-25T23:13:49.793922" elapsed="0.016382">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.826760" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.826591" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.826564" elapsed="0.000288"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.827212" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.827028" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.827823" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.827501" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.828248" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.828006" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.828830" elapsed="0.000186"/>
</kw>
<msg time="2026-04-25T23:13:50.829118" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:50.829164" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.828442" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:50.830022" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.830874" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.830702" elapsed="0.000777">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.830363" elapsed="0.001337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.832227" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.831885" elapsed="0.000544"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:50.829479" elapsed="0.002998"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:50.829263" elapsed="0.003264"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.829244" elapsed="0.003310"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:50.833298" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.833030" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:50.833371" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:13:50.833529" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.832768" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.833712" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.834400" level="INFO">index=32
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.834294" 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-04-25T23:13:50.834679" elapsed="0.002186"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.837272" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:50.838420" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.837014" elapsed="0.001799">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.841565" elapsed="0.000436"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.842153" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.842432" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.839578" elapsed="0.002999"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:50.839078" elapsed="0.003544"/>
</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="FAIL" start="2026-04-25T23:13:50.826192" elapsed="0.016529">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:50.842813" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:13:47.715225" elapsed="3.127680">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:47.714867" elapsed="3.128102"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:47.714737" elapsed="3.128273"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:13:47.714564" elapsed="3.128480"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:13:47.349882" elapsed="3.493219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.845526" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.845418" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.845400" elapsed="0.000230"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.849988" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.849847" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.849829" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.851001" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:50.850591" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.851471" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:50.851175" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:50.851541" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:13:50.851713" 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-04-25T23:13:50.850270" elapsed="0.001468"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.856793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.856685" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.856651" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.858149" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.857945" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.857927" elapsed="0.000358"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:50.858845" 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-04-25T23:13:50.858416" elapsed="0.000470"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.859339" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:50.859105" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.861221" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.860814" elapsed="0.000919">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:50.861917" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:13:50.861992" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.859588" elapsed="0.002457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.863930" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.863513" elapsed="0.000963">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:50.864669" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:13:50.864745" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.862297" elapsed="0.002484"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.865862" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.865245" elapsed="0.000787">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:50.864944" elapsed="0.001246">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:50.864922" elapsed="0.001319">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.866395" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.866764" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:50.866540" elapsed="0.000362"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:50.866521" elapsed="0.000407"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.866961" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.868779" elapsed="0.000314"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.869284" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.869609" elapsed="0.000116"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.868083" elapsed="0.001748"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:50.867203" elapsed="0.002722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.857583" elapsed="0.012427">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</status>
</kw>
<msg time="2026-04-25T23:13:50.870126" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:50.870170" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/MDSAL/northbound.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.857000" elapsed="0.013199"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.870381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.870276" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.870258" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.871413" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.871302" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.871284" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.871917" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.871619" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.872468" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.872189" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.872983" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.872709" 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-04-25T23:13:50.873513" elapsed="0.000371"/>
</kw>
<msg time="2026-04-25T23:13:50.874049" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:50.874224" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.873174" elapsed="0.001129"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:50.877153" elapsed="0.000885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.880535" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.880197" elapsed="0.001322">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.878712" elapsed="0.003072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.883881" elapsed="0.000220"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.882373" elapsed="0.001877"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:50.875182" elapsed="0.009244"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:50.874490" elapsed="0.010049"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.874446" elapsed="0.010150"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:50.886882" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.885877" elapsed="0.001032"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:50.886995" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:13:50.887150" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.885119" elapsed="0.002056"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.887317" elapsed="0.000513"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.888092" level="INFO">index=35
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.887987" 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-04-25T23:13:50.888352" elapsed="0.012105"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.900977" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:50.902121" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.900632" elapsed="0.001916">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.906008" 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="PASS" start="2026-04-25T23:13:50.907033" elapsed="0.000414"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.907696" elapsed="0.000299"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.903415" elapsed="0.004669"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:50.902859" elapsed="0.005272"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.871033" elapsed="0.037182">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.908593" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.908685" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.856383" elapsed="0.052412">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:50.908904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:50.908947" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.852102" elapsed="0.056868"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.909290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:50.909049" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.909030" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:50.851973" elapsed="0.057416"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:50.851795" elapsed="0.057625"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:13:50.849542" elapsed="0.059933"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:13:50.843669" elapsed="0.065861"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.843242" elapsed="0.066330"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:13:47.345089" elapsed="3.564534"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:13:50.910088" level="INFO">Creating Session using : alias=config, url=http://10.30.170.206:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfcc4a890&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>config</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${REST_API}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:13:50.909804" elapsed="0.000461"/>
</kw>
<doc>Setup resources and create session for Restconf checking.</doc>
<status status="PASS" start="2026-04-25T23:13:47.344806" elapsed="3.565554"/>
</kw>
<test id="s1-s3-s1-t1" name="Connect_To_ODL_Netconf" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:13:50.913360" elapsed="0.000263"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:13:50.913111" elapsed="0.000673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.914786" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.914651" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.914633" elapsed="0.000221"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.919250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.919139" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.919121" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.920299" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:13:50.919911" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.920786" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:13:50.920472" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:13:50.920857" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:13:50.921012" 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-04-25T23:13:50.919528" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.926213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.926107" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.926088" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.927476" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.927371" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.927354" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:50.928050" 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-04-25T23:13:50.927695" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.928460" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:50.928220" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.929281" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.929018" elapsed="0.001142">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:50.930335" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:13:50.930380" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.928630" elapsed="0.001786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.931250" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.930979" elapsed="0.001292">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:13:50.932444" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:13:50.932489" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.930573" elapsed="0.001939"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.933409" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.932817" elapsed="0.000674">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:13:50.932586" elapsed="0.000997">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:13:50.932567" elapsed="0.001049">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.933779" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.933992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:50.933865" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:13:50.933848" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.934151" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.936302" elapsed="0.000570"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.937641" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.938913" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.935008" elapsed="0.004288"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:50.934396" elapsed="0.005012"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.927073" elapsed="0.012421">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</status>
</kw>
<msg time="2026-04-25T23:13:50.939595" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:50.939638" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connect_To_ODL_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.926444" elapsed="0.013233"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.939868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.939756" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.939737" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.940809" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:13:50.940598" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.940580" elapsed="0.000296"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.942576" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.941013" elapsed="0.001718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.943131" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.942872" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:13:50.943553" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:13:50.943314" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.944106" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:13:50.944520" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:13:50.944565" 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-04-25T23:13:50.943762" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:13:50.945465" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.947413" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.946998" elapsed="0.000958">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.945862" elapsed="0.002171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.949495" elapsed="0.000365"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.948254" elapsed="0.001669"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:13:50.944974" elapsed="0.005049"/>
</kw>
<status status="PASS" start="2026-04-25T23:13:50.944764" elapsed="0.005310"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.944645" elapsed="0.005455"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:13:50.951039" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.950623" elapsed="0.000442"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:13:50.951114" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:13:50.951299" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.950290" elapsed="0.001034"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.951465" elapsed="0.000420"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.952145" level="INFO">index=38
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.952040" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.952406" elapsed="0.002004"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.954856" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:13:50.955633" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.954580" elapsed="0.001443">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.990644" 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-04-25T23:13:50.991742" elapsed="0.000203"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:13:50.992180" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:13:50.956897" elapsed="0.035500"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:13:50.956280" elapsed="0.036170"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.940307" elapsed="0.052241">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.992923" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:13:50.993003" 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="FAIL" start="2026-04-25T23:13:50.925770" elapsed="0.067345">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:13:50.993227" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:13:50.993272" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.921402" elapsed="0.071893"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:13:50.993623" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:13:50.993375" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-25T23:13:50.993355" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:13:50.921272" elapsed="0.072472"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:13:50.921092" elapsed="0.072683"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:13:50.918776" elapsed="0.075055"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:13:50.914356" elapsed="0.079531"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:13:50.913927" elapsed="0.080005"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:13:50.911014" elapsed="0.082970"/>
</kw>
<kw name="Create_ODL_Netconf_Connection">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.994996" level="INFO">${control} = 40</msg>
<var>${control}</var>
<arg>${host}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=60s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:50.994617" elapsed="0.000405"/>
</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-04-25T23:13:50.996827" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:13:50.996906" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:13:50.996462" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.997076" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:13:50.998229" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:13:51.312376" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:13:40 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   10.7% of 77.35GB   Users logged in:       0
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:13:47 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:13:50.997913" elapsed="0.314585"/>
</kw>
<msg time="2026-04-25T23:13:51.312608" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.997551" elapsed="0.315151"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:13:50.995989" elapsed="0.316816"/>
</kw>
<msg time="2026-04-25T23:13:51.312858" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:50.995579" elapsed="0.317326"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:13:50.995214" elapsed="0.317767"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:51.317671" level="INFO">${ssh_control} = 40</msg>
<arg>${ssh_control}</arg>
<arg>${control}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:51.313179" elapsed="0.004543"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:13:51.318251" level="INFO">${netconf} = 41</msg>
<var>${netconf}</var>
<arg>${host}</arg>
<arg>prompt=${ODL_SYSTEM_PROMPT}</arg>
<arg>timeout=60s</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:13:51.317881" elapsed="0.000397"/>
</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-04-25T23:13:51.320066" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:13:51.320145" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:13:51.319784" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:51.320315" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:13:51.321524" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:13:51.633638" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:13:40 UTC 2026

  System load:  0.02               Processes:             121
  Usage of /:   10.7% of 77.35GB   Users logged in:       0
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:13:51 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:13:51.321207" elapsed="0.312578"/>
</kw>
<msg time="2026-04-25T23:13:51.633864" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:51.320860" elapsed="0.313079"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:13:51.319296" elapsed="0.314753"/>
</kw>
<msg time="2026-04-25T23:13:51.634101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:13:51.318897" elapsed="0.315250"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:13:51.318490" elapsed="0.315753"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:51.638812" level="INFO">${ssh_netconf} = 41</msg>
<arg>${ssh_netconf}</arg>
<arg>${netconf}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:51.634464" elapsed="0.004396"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:51.642885" level="INFO">${ssh_port} = 2830</msg>
<arg>${ssh_port}</arg>
<arg>${port}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:51.639078" elapsed="0.003852"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:51.646822" level="INFO">${ssh_user} = admin</msg>
<arg>${ssh_user}</arg>
<arg>${user}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:51.643081" elapsed="0.003786"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:13:51.651175" level="INFO">${ssh_password} = admin</msg>
<arg>${ssh_password}</arg>
<arg>${password}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:13:51.647017" elapsed="0.004204"/>
</kw>
<doc>Open a netconf connecion to the given machine.</doc>
<status status="PASS" start="2026-04-25T23:13:50.994175" elapsed="0.657107"/>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<kw name="Reopen_ODL_Netconf_Connection">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:13:51.654816" level="INFO">sshpass -p admin ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@127.0.0.1 -p 2830 -s netconf</msg>
<arg>sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:13:51.652028" elapsed="0.002843"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.655679" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${hello}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:13:51.655017" elapsed="60.001374">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_control}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.656689" elapsed="0.000040"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${pid}</var>
<arg>ps -A | grep sshpass | awk '{print $1}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.656883" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf_pid}</arg>
<arg>${pid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.657062" elapsed="0.000021"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_netconf}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.657215" elapsed="0.000021"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.657279" elapsed="0.000023"/>
</return>
<var>${hello}</var>
<doc>Reopen a closed netconf connection.</doc>
<status status="FAIL" start="2026-04-25T23:13:51.651775" elapsed="60.005647">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Get_Data">
<var>${hello_message}</var>
<arg>hello</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.657627" elapsed="0.000027"/>
</kw>
<kw name="Transmit_Message">
<arg>${hello_message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.657800" elapsed="0.000021"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.657861" elapsed="0.000017"/>
</return>
<doc>Open a prepared netconf connecion.</doc>
<status status="FAIL" start="2026-04-25T23:13:51.651466" elapsed="60.006500">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:14:51.659350" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:14:51.658951" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.658930" elapsed="0.000522"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:14:51.659586" elapsed="0.000403"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.664793" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:14:51.664272" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:14:51.665042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.664897" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.664878" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.665538" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:14:51.665238" elapsed="0.000327"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:14:51.666063" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Connect_To_ODL_Netconf</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:14:51.665728" elapsed="0.000362"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:14:51.666414" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:14:51.666238" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.666958" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:14:51.666587" elapsed="0.000501"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.667591" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:14:51.667239" elapsed="0.000381"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.668231" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:14:51.667780" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.668742" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:14:51.668429" elapsed="0.000367"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:14:51.663976" elapsed="0.004877"/>
</kw>
<status status="PASS" start="2026-04-25T23:14:51.658730" elapsed="0.010174"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:14:51.658292" elapsed="0.010654"/>
</kw>
<doc>Connect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-25T23:13:50.910433" elapsed="60.758554">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t2" name="Get_Config_Running" line="62">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:14:51.672518" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:14:51.672266" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.673771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.673642" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.673623" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.678580" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.678359" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.678341" elapsed="0.000329"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.679679" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:14:51.679250" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.680153" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:14:51.679858" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:14:51.680222" elapsed="0.000066"/>
</return>
<msg time="2026-04-25T23:14:51.680426" 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-04-25T23:14:51.678885" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.685549" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.685439" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.685420" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.686869" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.686762" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.686744" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:14:51.687441" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:14:51.687073" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.687954" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:14:51.687696" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.688935" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.688510" elapsed="0.001364">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:14:51.690056" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:14:51.690102" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.688131" elapsed="0.001996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.690968" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.690686" elapsed="0.001339">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:14:51.692204" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:14:51.692250" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.690286" elapsed="0.001988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.693206" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.692557" elapsed="0.000729">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:14:51.692350" elapsed="0.001031">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:14:51.692330" elapsed="0.001086">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.693566" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.693801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:14:51.693668" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:14:51.693635" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.693930" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:14:51.696903" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:14:51.697126" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:14:51.696143" elapsed="0.001079"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.698158" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.699005" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:14:51.694771" elapsed="0.004348"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:14:51.694183" elapsed="0.005052"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.686435" elapsed="0.012885">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</status>
</kw>
<msg time="2026-04-25T23:14:51.699422" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:14:51.699467" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.685775" elapsed="0.013716"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.699725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.699571" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.699552" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.700579" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:14:51.700474" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.700454" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.701010" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:14:51.701148" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:14:51.700887" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.701577" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:14:51.701317" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:14:51.702027" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:14:51.701781" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:14:51.702565" elapsed="0.000339"/>
</kw>
<msg time="2026-04-25T23:14:51.703004" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:14:51.703051" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.702218" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:14:51.703893" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.706089" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.705470" elapsed="0.001156">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.704284" elapsed="0.002483"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:14:51.708122" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.706994" elapsed="0.001552"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:14:51.703359" elapsed="0.005289"/>
</kw>
<status status="PASS" start="2026-04-25T23:14:51.703151" elapsed="0.005673"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.703133" elapsed="0.005717"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:14:51.709784" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:14:51.709363" elapsed="0.000448"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:14:51.709860" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:14:51.710012" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:14:51.709045" elapsed="0.000992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:14:51.710184" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.710882" level="INFO">index=42
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:14:51.710774" 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-04-25T23:14:51.711143" elapsed="0.002126"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.713700" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:14:51.715793" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.713421" elapsed="0.002749">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:14:51.727706" elapsed="0.000562"/>
</kw>
<msg time="2026-04-25T23:14:51.728327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:14:51.725926" elapsed="0.002489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.729006" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.729263" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:14:51.717057" elapsed="0.012345"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:14:51.716431" elapsed="0.013055"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.700177" elapsed="0.029396">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.729910" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:14:51.729983" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.685099" elapsed="0.044988">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:14:51.730196" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:14:51.730238" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.680838" elapsed="0.049423"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:14:51.730614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:14:51.730369" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-25T23:14:51.730319" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:14:51.680705" elapsed="0.050026"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:14:51.680508" elapsed="0.050254"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:14:51.677990" elapsed="0.052826"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:14:51.673355" elapsed="0.057515"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:14:51.672940" elapsed="0.057974"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:14:51.670027" elapsed="0.060939"/>
</kw>
<kw name="Check_Test_Objects_Not_Present_In_Config">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:14:51.732278" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:14:51.732448" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:14:51.732046" elapsed="0.000431"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:14:51.732522" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:14:51.732798" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:14:51.731708" elapsed="0.001120"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.736930" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:14:51.733769" elapsed="0.003219"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.738553" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:14:51.737129" elapsed="0.001499"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:14:51.746909" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:14:51.738789" elapsed="0.008191"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:14:51.733456" elapsed="0.013582"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.747858" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.747178" elapsed="60.001503">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.748792" elapsed="0.000038"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.732970" elapsed="60.016000">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.749039" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.731403" elapsed="60.017739">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:15:51.749396" elapsed="0.000032"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;REPLACE&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.749599" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.749681" elapsed="0.000017"/>
</return>
<arg>get-config</arg>
<doc>Use dataset with the specified name to get the configuration and check that none of our test objects are there.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.731126" elapsed="60.018661">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:15:51.751164" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:15:51.750771" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.750750" elapsed="0.000502"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:15:51.751392" elapsed="0.000428"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.756554" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:15:51.756114" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:15:51.756822" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.756675" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.756641" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.757320" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:15:51.757019" elapsed="0.000328"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:15:51.757783" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_Config_Running</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:15:51.757493" elapsed="0.000318"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:15:51.758137" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:15:51.757961" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.758676" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:15:51.758313" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.759161" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:15:51.758850" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.759811" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:15:51.759331" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.760309" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:15:51.760013" elapsed="0.000343"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:15:51.755817" elapsed="0.004632"/>
</kw>
<status status="PASS" start="2026-04-25T23:15:51.750536" elapsed="0.009966"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:15:51.750112" elapsed="0.010432"/>
</kw>
<doc>Make sure the configuration has only the default elements in it.</doc>
<status status="FAIL" start="2026-04-25T23:14:51.669241" elapsed="60.091344">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t3" name="Missing_Message_ID_Attribute" line="66">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:15:51.764150" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:15:51.763899" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.765385" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.765277" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.765258" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.769925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.769819" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.769801" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.770965" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:15:51.770567" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.771435" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:15:51.771139" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:15:51.771506" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:15:51.771682" 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-04-25T23:15:51.770204" elapsed="0.001505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.776796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.776686" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.776665" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.778177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.778063" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.778045" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:15:51.778768" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:15:51.778378" elapsed="0.000417"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.779195" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:15:51.778944" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.780192" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.779763" elapsed="0.001351">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:15:51.781299" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:15:51.781346" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.779369" elapsed="0.002002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.782233" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.781955" elapsed="0.001373">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:15:51.783509" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:15:51.783555" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.781532" elapsed="0.002047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.784609" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.783993" elapsed="0.000778">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:15:51.783749" elapsed="0.001122">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:15:51.783727" elapsed="0.001178">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.785054" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.785274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:15:51.785144" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:15:51.785126" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.785404" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:15:51.788296" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:15:51.788516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:15:51.787591" elapsed="0.001033"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.789469" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.790292" 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-04-25T23:15:51.786246" 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-04-25T23:15:51.785672" elapsed="0.004854"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.777643" elapsed="0.012969">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</status>
</kw>
<msg time="2026-04-25T23:15:51.790730" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:15:51.790776" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Missing_Message_ID_Attribute"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.777002" elapsed="0.013798"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.790986" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.790878" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.790860" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.791871" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:15:51.791749" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.791732" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.792204" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:15:51.792307" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:15:51.792079" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.792842" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:15:51.792472" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:15:51.793327" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:15:51.793027" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:15:51.793891" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:15:51.794313" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:15:51.794360" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.793524" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:15:51.795179" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.797467" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.796892" elapsed="0.001161">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.795567" elapsed="0.002565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:15:51.799487" elapsed="0.000416"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.798360" elapsed="0.001609"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:15:51.794685" elapsed="0.005387"/>
</kw>
<status status="PASS" start="2026-04-25T23:15:51.794461" elapsed="0.005664"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.794442" elapsed="0.005708"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:15:51.801093" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:15:51.800687" elapsed="0.000434"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:15:51.801169" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:15:51.801320" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:15:51.800344" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:15:51.801484" elapsed="0.000428"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.802175" level="INFO">index=43
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:15:51.802068" 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-04-25T23:15:51.802441" elapsed="0.002053"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.805069" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:15:51.808281" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.804646" elapsed="0.004051">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:15:51.820406" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:15:51.820796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:15:51.818530" elapsed="0.002356"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.821205" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.821476" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:15:51.809457" elapsed="0.012180"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:15:51.808959" elapsed="0.012787"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.791431" elapsed="0.030400">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.822154" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:15:51.822228" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.776333" elapsed="0.046001">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:15:51.822439" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:15:51.822483" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.772098" elapsed="0.050409"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:15:51.823075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:15:51.822618" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-25T23:15:51.822599" elapsed="0.000556"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:15:51.771967" elapsed="0.051211"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:15:51.771765" elapsed="0.051443"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:15:51.769445" elapsed="0.053818"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:15:51.764989" elapsed="0.058330"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:15:51.764553" elapsed="0.058811"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:15:51.761713" elapsed="0.061705"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:15:51.824803" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/missing-attr-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/missing-attr-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:15:51.824986" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
  &lt;get-config&gt;
    &lt;source&gt;
      &lt;running/&gt;
    &lt;/source&gt;
  &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:15:51.824502" elapsed="0.000512"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:15:51.825060" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:15:51.825209" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
  &lt;get-config&gt;
    &lt;source&gt;
      &lt;running/&gt;
    &lt;/source&gt;
  &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:15:51.824189" elapsed="0.001047"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.829480" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:15:51.826184" elapsed="0.003359"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.830456" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:15:51.829716" elapsed="0.000793"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:15:51.840405" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:15:51.830649" elapsed="0.009837"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:15:51.825884" elapsed="0.014664"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.841151" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.840708" elapsed="60.001097">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.841916" elapsed="0.000034"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.825379" elapsed="60.016699">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.842140" elapsed="0.000022"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.823896" elapsed="60.018353">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.842483" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.842705" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.842870" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.843031" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.843170" elapsed="0.000017"/>
</return>
<arg>missing-attr</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:15:51.823584" elapsed="60.019693">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:16:51.844693" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:16:51.844276" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.844255" elapsed="0.000534"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:16:51.844929" elapsed="0.000380"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.850034" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:16:51.849564" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:16:51.850284" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.850140" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.850120" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.850796" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:16:51.850480" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:16:51.851240" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Missing_Message_ID_Attribute</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.850966" elapsed="0.000302"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:16:51.851590" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:16:51.851415" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.852132" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:16:51.851785" elapsed="0.000375"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.852620" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:16:51.852312" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.853275" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:16:51.852825" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.853791" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:16:51.853473" elapsed="0.000366"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:16:51.849263" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-25T23:16:51.844034" elapsed="0.009910"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:16:51.843605" elapsed="0.010381"/>
</kw>
<doc>Check that messages with missing "message-ID" attribute are rejected with the correct error (RFC 6241, section 4.1).</doc>
<status status="FAIL" start="2026-04-25T23:15:51.761077" elapsed="60.092950">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t4" name="Additional_Attributes_In_Message" 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-04-25T23:16:51.857788" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:16:51.857520" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.859035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.858923" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.858903" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.863543" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.863437" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.863419" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.864622" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:16:51.864202" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.865113" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:16:51.864816" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:16:51.865183" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:16:51.865341" 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-04-25T23:16:51.863838" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.870449" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.870326" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.870307" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.871770" elapsed="0.000153"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.871632" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.871614" elapsed="0.000365"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:16:51.872511" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.872114" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.872960" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:16:51.872704" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.875427" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.873528" elapsed="0.002883">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:16:51.876595" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:16:51.876642" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.873133" elapsed="0.003597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.877565" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.877285" elapsed="0.001314">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:16:51.878796" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:16:51.878842" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.876899" elapsed="0.001966"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.879790" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.879152" elapsed="0.000717">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:16:51.878942" elapsed="0.001023">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:16:51.878922" elapsed="0.001078">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.880163" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.880440" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:16:51.880270" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:16:51.880234" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.880571" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:16:51.883492" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:16:51.883745" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:16:51.882840" 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-04-25T23:16:51.884639" elapsed="0.000137"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.885541" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:16:51.881434" elapsed="0.004239"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:16:51.880865" elapsed="0.004925"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.871306" elapsed="0.014569">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</status>
</kw>
<msg time="2026-04-25T23:16:51.885979" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:16:51.886023" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Additional_Attributes_In_Message"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.870670" elapsed="0.015377"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.886231" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.886123" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.886105" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.887089" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:16:51.886985" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.886967" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.887410" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:16:51.887512" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:16:51.887292" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.887974" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:16:51.887711" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:16:51.888429" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:16:51.888158" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.889074" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:16:51.889490" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:16:51.889537" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.888619" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:16:51.890363" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.892361" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.891924" elapsed="0.001298">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.890767" elapsed="0.002533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:16:51.894642" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.893526" elapsed="0.001554"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:16:51.889865" elapsed="0.005320"/>
</kw>
<status status="PASS" start="2026-04-25T23:16:51.889635" elapsed="0.005603"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.889617" elapsed="0.005678"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:16:51.896247" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.895838" elapsed="0.000460"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:16:51.896347" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:16:51.896502" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:16:51.895495" elapsed="0.001031"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.896747" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.897430" level="INFO">index=44
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:16:51.897322" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:16:51.897708" elapsed="0.002034"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.900163" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:16:51.902740" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.899899" elapsed="0.003213">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:16:51.914809" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:16:51.915181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:16:51.913581" elapsed="0.001689"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.915585" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.915865" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:16:51.903906" elapsed="0.012101"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:16:51.903371" elapsed="0.012686"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.886686" elapsed="0.029454">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.916478" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:16:51.916552" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.869983" elapsed="0.046861">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:16:51.916953" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:16:51.916998" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.865742" elapsed="0.051279"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:16:51.917340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:16:51.917099" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-25T23:16:51.917081" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:16:51.865598" elapsed="0.051844"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:16:51.865422" elapsed="0.052051"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:16:51.863077" elapsed="0.054450"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:16:51.858614" elapsed="0.058969"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:16:51.858196" elapsed="0.059432"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:16:51.855283" elapsed="0.062450"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:16:51.918716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/additional-attr-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/additional-attr-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:16:51.918887" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1" attribute="something" additional="otherthing" xmlns:prefix="http://www.example.com/my-schema-example.html"&gt;
    &lt;get-config&gt;
       ...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:16:51.918472" elapsed="0.000443"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:16:51.918962" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:16:51.919113" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1" attribute="something" additional="otherthing" xmlns:prefix="http://www.example.com/my-schema-example.html"&gt;
    &lt;get-config&gt;
       ...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:16:51.918164" elapsed="0.000977"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.923967" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1" attribute="something" additional="otherthing" xmlns:prefix="http://www.example.com/my-schema-example.html"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:16:51.919899" elapsed="0.004127"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.925330" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:16:51.924167" elapsed="0.001218"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:16:51.933156" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:16:51.925526" elapsed="0.007890"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:16:51.919575" elapsed="0.013900"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.934225" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.933614" elapsed="60.001346">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.935079" elapsed="0.000049"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.919284" elapsed="60.015992">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.935340" elapsed="0.000018"/>
</return>
<var>${reply}</var>
<arg>additional-attr</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:16:51.917889" elapsed="60.017554">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.935709" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>message-id="1"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.935876" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>attribute="something"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.936042" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>additional="otherthing"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.936196" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>xmlns:prefix="http://www.example.com/my-schema-example.html"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.936349" elapsed="0.000020"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:17:51.937835" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:17:51.937415" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.937393" elapsed="0.000610"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:17:51.938153" elapsed="0.000392"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.943299" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:17:51.942856" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:17:51.943546" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.943403" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.943384" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.944080" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:17:51.943761" elapsed="0.000346"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:17:51.944516" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Additional_Attributes_In_Message</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.944252" elapsed="0.000290"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:17:51.944882" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:17:51.944704" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.945407" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:17:51.945056" elapsed="0.000379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.945904" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:17:51.945577" elapsed="0.000356"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.946530" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:17:51.946080" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.947041" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:17:51.946742" elapsed="0.000347"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:17:51.942546" elapsed="0.004598"/>
</kw>
<status status="PASS" start="2026-04-25T23:17:51.937184" elapsed="0.010011"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:17:51.936743" elapsed="0.010494"/>
</kw>
<doc>Check that additional attributes in messages are returned properly (RFC 6241, sections 4.1 and 4.2).</doc>
<status status="FAIL" start="2026-04-25T23:16:51.854647" elapsed="60.092629">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t5" name="Send_Stuff_In_Undefined_Namespace" 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-04-25T23:17:51.950701" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:17:51.950434" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.951957" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.951836" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.951817" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.956743" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.956619" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.956601" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.957855" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:17:51.957451" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.958333" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:17:51.958032" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:17:51.958405" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:17:51.958565" 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-04-25T23:17:51.957077" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.963801" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.963692" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.963672" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.965126" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.965017" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.964997" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:17:51.965811" level="INFO">${karaf_connection_index} = 44</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.965327" elapsed="0.000512"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.966263" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:17:51.965989" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.967110" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.966834" elapsed="0.001220">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:17:51.968242" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:17:51.968287" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.966437" elapsed="0.001873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.969145" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.968865" elapsed="0.001318">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:17:51.970361" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:17:51.970406" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.968467" elapsed="0.001962"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.971343" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.970742" elapsed="0.000682">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:17:51.970504" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:17:51.970484" elapsed="0.001238">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.971877" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.972120" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:17:51.971987" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:17:51.971947" elapsed="0.000271"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.972251" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:17:51.975110" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:17:51.975331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:17:51.974446" elapsed="0.000980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.976259" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:51.977197" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:17:51.973104" elapsed="0.004209"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:17:51.972510" elapsed="0.004917"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.964712" elapsed="0.012799">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</status>
</kw>
<msg time="2026-04-25T23:17:51.977613" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:17:51.977672" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Send_Stuff_In_Undefined_Namespace"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.964029" elapsed="0.013668"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.977883" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.977775" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.977756" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:17:51.978758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:17:51.978635" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.978617" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.979087" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:17:51.979190" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:17:51.978964" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.979608" level="INFO">{1: 44}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:17:51.979353" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:17:51.980097" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:17:51.979830" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.980628" elapsed="0.000470"/>
</kw>
<msg time="2026-04-25T23:17:51.981197" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:17:51.981242" level="INFO">${old_connection_index} = 44</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.980285" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:17:51.982059" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.984157" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.983601" elapsed="0.001199">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.982442" elapsed="0.002434"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:17:51.986222" elapsed="0.000362"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.985103" elapsed="0.001544"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:17:51.981546" elapsed="0.005219"/>
</kw>
<status status="PASS" start="2026-04-25T23:17:51.981340" elapsed="0.005476"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:51.981321" elapsed="0.005521"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:17:51.987778" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.987344" elapsed="0.000462"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:17:51.987853" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:17:51.988027" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:17:51.987033" elapsed="0.001020"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.988194" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.988968" level="INFO">index=45
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:17:51.988861" elapsed="0.000272"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:17:51.989270" elapsed="0.002193"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:17:51.991903" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:17:51.994048" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.991614" elapsed="0.002806">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:17:52.006220" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:17:52.006594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:17:52.004993" elapsed="0.001718"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:52.007029" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:52.007278" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:17:51.995211" elapsed="0.012206"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:17:51.994711" elapsed="0.012756"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.978347" elapsed="0.029203">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:52.008071" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:17:52.008146" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.963342" elapsed="0.044910">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:17:52.008357" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:17:52.008400" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.958968" elapsed="0.049455"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:17:52.008755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:17:52.008500" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-25T23:17:52.008482" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:17:51.958838" elapsed="0.050018"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:17:51.958647" elapsed="0.050240"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:17:51.956252" elapsed="0.052689"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:17:51.951525" elapsed="0.057471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:17:51.951109" elapsed="0.057938"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:17:51.948416" elapsed="0.060685"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:17:52.010075" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-nonexistent-namespace-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-nonexistent-namespace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:17:52.010255" level="INFO">${data} = &lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
  &lt;edit-config&gt;
    &lt;target&gt;
      &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;default-operation&gt;merge&lt;/default-operation&gt;
    &lt;config&gt;
...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:17:52.009849" elapsed="0.000435"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:17:52.010329" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:17:52.010478" level="INFO">${request} = &lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
  &lt;edit-config&gt;
    &lt;target&gt;
      &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;default-operation&gt;merge&lt;/default-operation&gt;
    &lt;config&gt;
...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:17:52.009526" elapsed="0.001012"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:17:52.014515" level="INFO">&lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:17:52.011313" elapsed="0.003302"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:17:52.015606" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:17:52.014797" elapsed="0.000901"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:17:52.042904" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;does-not-exist xmlns="urn:this:is:in:a:nonexistent:namespace"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;TOY001&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;name&gt;Some Toy&lt;/name&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;2016&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `2016'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;category&gt;toys&lt;/category&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/does-not-exist&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:17:52.015872" elapsed="0.027132"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:17:52.011014" elapsed="0.032050"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.043685" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:17:52.043209" elapsed="60.001132">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.044455" elapsed="0.000043"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:17:52.010715" elapsed="60.033914">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.044716" elapsed="0.000027"/>
</return>
<var>${reply}</var>
<arg>merge-nonexistent-namespace</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:17:52.009256" elapsed="60.035573">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Set_Known_Bug_Id" owner="SetupUtils">
<arg>5125</arg>
<doc>Tell the Teardown keywords that any failure from now on is due to the specified known bug.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.045169" elapsed="0.000030"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>java.lang.NullPointerException</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.045350" elapsed="0.000021"/>
</kw>
<kw name="Set_Unknown_Bug_Id" owner="SetupUtils">
<doc>Tell the Teardown keywords that from now on there is no longer known bug causing the failure so it should use linked bugs.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.045548" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>urn:this:is:in:a:nonexistent:namespace</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.045720" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;rpc-error&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.045874" elapsed="0.000025"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:18:52.047599" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:18:52.047201" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.047180" elapsed="0.000521"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:18:52.047920" elapsed="0.000389"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.053216" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:18:52.052772" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:18:52.053465" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.053321" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.053301" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.053981" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:18:52.053680" elapsed="0.000328"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:18:52.054429" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Send_Stuff_In_Undefined_Namespace</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:18:52.054155" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:18:52.054803" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:18:52.054602" elapsed="0.000228"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.055332" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:18:52.054979" elapsed="0.000381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.055831" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:18:52.055504" elapsed="0.000356"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.056453" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:18:52.056003" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.057001" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:18:52.056650" elapsed="0.000400"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:18:52.052435" elapsed="0.004670"/>
</kw>
<status status="PASS" start="2026-04-25T23:18:52.046637" elapsed="0.010518"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:18:52.046220" elapsed="0.010977"/>
</kw>
<doc>Try to send something within an undefined namespace and check the reply complains about the nonexistent namespace and element.</doc>
<status status="FAIL" start="2026-04-25T23:17:51.947735" elapsed="60.109503">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t6" name="Edit_Config_First_Batch_Merge" line="88">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:18:52.060788" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:18:52.060509" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.062051" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.061940" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.061921" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.066546" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.066440" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.066422" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.067628" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:18:52.067242" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.068121" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:18:52.067821" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:18:52.068193" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:18:52.068350" 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-04-25T23:18:52.066877" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.073672" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.073549" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.073530" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.074953" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.074846" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.074828" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:18:52.075513" 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-04-25T23:18:52.075153" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.075954" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:18:52.075703" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.076795" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.076498" elapsed="0.001337">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:18:52.078027" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:18:52.078089" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.076127" elapsed="0.001987"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.078946" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.078669" elapsed="0.001306">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:18:52.080150" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:18:52.080196" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.078272" elapsed="0.001947"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.081146" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.080502" elapsed="0.000725">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:18:52.080294" elapsed="0.001025">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:18:52.080275" elapsed="0.001079">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.081504" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.081734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:18:52.081590" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:18:52.081573" elapsed="0.000257"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.081863" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:18:52.085013" elapsed="0.000165"/>
</kw>
<msg time="2026-04-25T23:18:52.085251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:18:52.084247" elapsed="0.001102"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.086270" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.087169" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:18:52.082902" elapsed="0.004388"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:18:52.082116" elapsed="0.005289"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.074521" elapsed="0.012970">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</status>
</kw>
<msg time="2026-04-25T23:18:52.087596" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:18:52.087639" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_First_Batch_Merge"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.073882" elapsed="0.013884"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.087958" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.087847" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.087827" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.089031" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:18:52.088923" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.088904" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.089367" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:18:52.089471" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:18:52.089238" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.089915" level="INFO">{1: 45}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:18:52.089641" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:18:52.090344" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:18:52.090101" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:18:52.090893" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:18:52.091310" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:18:52.091357" 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-04-25T23:18:52.090533" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:18:52.092291" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.094257" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.093843" elapsed="0.000960">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.092690" elapsed="0.002189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:18:52.096318" elapsed="0.000368"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.095100" elapsed="0.001650"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:18:52.091781" elapsed="0.005097"/>
</kw>
<status status="PASS" start="2026-04-25T23:18:52.091455" elapsed="0.005474"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.091437" elapsed="0.005517"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:18:52.097874" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:18:52.097456" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:18:52.097948" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:18:52.098099" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:18:52.097146" elapsed="0.000977"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:18:52.098266" elapsed="0.000433"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.098962" level="INFO">index=46
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:18:52.098856" elapsed="0.000269"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:18:52.099261" elapsed="0.002055"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.101741" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:18:52.103916" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.101466" elapsed="0.002822">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:18:52.116566" elapsed="0.000453"/>
</kw>
<msg time="2026-04-25T23:18:52.117079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:18:52.115160" elapsed="0.002009"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.117491" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.117757" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:18:52.105107" elapsed="0.012792"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:18:52.104559" elapsed="0.013388"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.088587" elapsed="0.029442">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.118354" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:18:52.118428" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.073202" elapsed="0.045330">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:18:52.118638" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:18:52.118699" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.068766" elapsed="0.049958"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:18:52.119044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:18:52.118803" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-25T23:18:52.118784" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:18:52.068605" elapsed="0.050539"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:18:52.068430" elapsed="0.050744"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:18:52.066081" elapsed="0.053148"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:18:52.061623" elapsed="0.057661"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:18:52.061208" elapsed="0.058121"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:18:52.058488" elapsed="0.060894"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:18:52.120957" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-1-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:18:52.121126" level="INFO">${data} = &lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:openday...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:18:52.120711" elapsed="0.000444"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:18:52.121201" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:18:52.121361" level="INFO">${request} = &lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:openday...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:18:52.120388" elapsed="0.001038"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.125172" level="INFO">&lt;rpc message-id="2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:18:52.122198" elapsed="0.003046"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.126227" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:18:52.125426" elapsed="0.000854"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:18:52.180460" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;TOY001&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;model&gt;Toyota Corolla&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Toyota&lt;/manufacturer&gt; [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;year&gt;2016&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `2016'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;category&gt;sedan&lt;/category&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUST001&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;32&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `32'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;TOY001&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUST001&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:18:52.126481" elapsed="0.054346"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:18:52.121891" elapsed="0.059077"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.185506" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.181213" elapsed="60.008990">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.190343" elapsed="0.000040"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.121573" elapsed="60.068961">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.190606" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.120096" elapsed="60.070631">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.191480" elapsed="0.000029"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.192321" elapsed="0.000024"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.192491" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.192681" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.192748" elapsed="0.000016"/>
</return>
<arg>merge-1</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.119549" elapsed="60.073306">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:19:52.195080" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:19:52.194349" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.194326" elapsed="0.000844"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:19:52.195313" elapsed="0.000417"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.200459" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:19:52.200019" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:19:52.200734" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.200576" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.200556" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.201228" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:19:52.200930" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:19:52.201686" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_First_Batch_Merge</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:19:52.201398" elapsed="0.000316"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:19:52.202036" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:19:52.201861" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.202556" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:19:52.202210" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.203051" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:19:52.202741" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.203679" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:19:52.203220" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.204171" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:19:52.203876" elapsed="0.000343"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:19:52.199723" elapsed="0.004551"/>
</kw>
<status status="PASS" start="2026-04-25T23:19:52.194115" elapsed="0.010209"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:19:52.193195" elapsed="0.011170"/>
</kw>
<doc>Request a "merge" operation adding an element in candidate configuration and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:18:52.057853" elapsed="60.146600">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t7" name="Get_Config_Running_To_Confirm_No_Edit_Before_Commit" line="92">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:19:52.207830" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:19:52.207562" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.209073" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.208964" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.208946" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.213596" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.213489" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.213471" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.214671" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:19:52.214266" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.215140" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:19:52.214848" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:19:52.215210" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:19:52.215367" 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-04-25T23:19:52.213898" 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-04-25T23:19:52.220641" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.220515" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.220496" 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-04-25T23:19:52.221953" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.221847" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.221829" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:19:52.222523" 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-04-25T23:19:52.222153" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.222992" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:19:52.222738" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.223839" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.223540" elapsed="0.001281">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:19:52.225002" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:19:52.225048" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.223163" elapsed="0.001909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.225900" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.225605" elapsed="0.001329">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:19:52.227110" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:19:52.227156" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.225226" elapsed="0.001953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.228078" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.227458" elapsed="0.000700">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:19:52.227254" elapsed="0.001040">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:19:52.227235" elapsed="0.001096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.228479" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.228729" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:19:52.228570" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:19:52.228554" elapsed="0.000272"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.228859" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:19:52.231743" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:19:52.231967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:19:52.231074" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.232995" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.233805" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:19:52.229726" elapsed="0.004196"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:19:52.229129" elapsed="0.004906"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.221515" elapsed="0.012606">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</status>
</kw>
<msg time="2026-04-25T23:19:52.234223" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:19:52.234272" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Edit_Before_Commit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.220872" elapsed="0.013423"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.234483" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.234377" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.234357" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.237412" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:19:52.237302" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.237283" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.237765" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:19:52.237870" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:19:52.237623" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.238297" level="INFO">{1: 46}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:19:52.238035" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:19:52.238737" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:19:52.238479" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:19:52.239273" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:19:52.239723" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:19:52.239769" 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-04-25T23:19:52.238927" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:19:52.240569" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.242710" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.242266" elapsed="0.001000">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.241102" elapsed="0.002240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:19:52.244829" elapsed="0.000406"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.243567" elapsed="0.001731"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:19:52.240077" elapsed="0.005323"/>
</kw>
<status status="PASS" start="2026-04-25T23:19:52.239868" elapsed="0.005583"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.239849" elapsed="0.005628"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:19:52.246409" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:19:52.246003" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:19:52.246485" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:19:52.246640" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:19:52.245688" elapsed="0.000992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:19:52.246825" elapsed="0.000416"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.247505" level="INFO">index=47
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:19:52.247396" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:19:52.247784" elapsed="0.002092"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.250290" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:19:52.252795" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.250029" elapsed="0.003149">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:19:52.265439" elapsed="0.000355"/>
</kw>
<msg time="2026-04-25T23:19:52.265863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:19:52.264129" elapsed="0.001831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.266280" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.266531" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:19:52.254218" elapsed="0.012736"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:19:52.253455" elapsed="0.013553"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.236996" elapsed="0.030103">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.267482" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:19:52.267560" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.220179" elapsed="0.047673">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:19:52.267968" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:19:52.268011" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.215785" elapsed="0.052249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:19:52.268375" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:19:52.268121" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-25T23:19:52.268099" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:19:52.215640" elapsed="0.052839"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:19:52.215458" elapsed="0.053115"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:19:52.213123" elapsed="0.055515"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:19:52.208675" elapsed="0.060069"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:19:52.208230" elapsed="0.060562"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:19:52.205538" elapsed="0.063309"/>
</kw>
<kw name="Check_Test_Objects_Not_Present_In_Config">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:19:52.270149" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-no-edit-before-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-no-edit-before-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:19:52.270365" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:19:52.269920" elapsed="0.000473"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:19:52.270438" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:19:52.270586" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:19:52.269598" elapsed="0.001015"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.274099" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:19:52.271438" elapsed="0.002720"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.275126" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:19:52.274301" elapsed="0.000878"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:19:52.283337" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:19:52.275334" elapsed="0.008074"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:19:52.271103" elapsed="0.012362"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.284212" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.283602" elapsed="60.001335">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.285049" elapsed="0.000041"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.270810" elapsed="60.014429">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.285307" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.269311" elapsed="60.016098">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:20:52.285679" elapsed="0.000029"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;REPLACE&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.285898" elapsed="0.000028"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.285973" elapsed="0.000015"/>
</return>
<arg>get-config-no-edit-before-commit</arg>
<doc>Use dataset with the specified name to get the configuration and check that none of our test objects are there.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.269022" elapsed="60.017054">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:20:52.287533" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:20:52.287118" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.287096" elapsed="0.000644"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:20:52.287886" elapsed="0.000387"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.293339" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:20:52.292899" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:20:52.293588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.293444" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.293424" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.294102" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:20:52.293802" elapsed="0.000327"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:20:52.294576" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_Config_Running_To_Confirm_No_Edit_Before_Commit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:20:52.294276" elapsed="0.000328"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:20:52.294951" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:20:52.294769" elapsed="0.000207"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.295476" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit"
reference somewher...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:20:52.295127" elapsed="0.000376"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.295977" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:20:52.295646" elapsed="0.000358"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.296593" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:20:52.296146" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.297106" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:20:52.296808" elapsed="0.000346"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:20:52.292580" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-25T23:20:52.286896" elapsed="0.010365"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:20:52.286408" elapsed="0.010895"/>
</kw>
<doc>Make sure the running configuration is still unchanged as the change was not commited yet.</doc>
<status status="FAIL" start="2026-04-25T23:19:52.204949" elapsed="60.092397">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t8" name="Commit_Edit" line="96">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:20:52.300904" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:20:52.300636" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.302283" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.302151" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.302132" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.306922" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.306815" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.306796" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.307965" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:20:52.307564" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.308448" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:20:52.308153" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:20:52.308519" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:20:52.308693" 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-04-25T23:20:52.307200" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.313939" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.313831" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.313812" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.315241" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.315134" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.315116" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:20:52.315835" 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-04-25T23:20:52.315440" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.316260" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:20:52.316009" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.317104" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.316828" elapsed="0.001195">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:20:52.318205" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:20:52.318251" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.316432" elapsed="0.001843"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.319152" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.318859" elapsed="0.001352">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:20:52.320391" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:20:52.320437" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.318432" elapsed="0.002029"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.321377" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.320777" elapsed="0.000679">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:20:52.320538" elapsed="0.001013">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:20:52.320518" elapsed="0.001068">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.321753" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.321976" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:20:52.321846" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:20:52.321829" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.322104" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:20:52.325125" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:20:52.325349" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:20:52.324305" elapsed="0.001139"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.326276" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.327118" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:20:52.322953" elapsed="0.004279"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:20:52.322358" elapsed="0.004992"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.314832" elapsed="0.012602">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</status>
</kw>
<msg time="2026-04-25T23:20:52.327537" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:20:52.327581" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Edit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.314145" elapsed="0.013461"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.327820" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.327710" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.327689" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.328934" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:20:52.328820" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.328794" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.329265" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:20:52.329369" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:20:52.329142" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.329812" level="INFO">{1: 47}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:20:52.329536" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:20:52.330240" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:20:52.329997" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:20:52.330802" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:20:52.331221" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:20:52.331266" 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-04-25T23:20:52.330428" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:20:52.332100" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.334212" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.333792" elapsed="0.001022">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.332483" elapsed="0.002408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:20:52.336239" elapsed="0.000359"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.335114" elapsed="0.001569"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:20:52.331572" elapsed="0.005215"/>
</kw>
<status status="PASS" start="2026-04-25T23:20:52.331364" elapsed="0.005474"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.331346" elapsed="0.005518"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:20:52.337787" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:20:52.337368" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:20:52.337860" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:20:52.338009" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:20:52.337058" 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-04-25T23:20:52.338173" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.338946" level="INFO">index=48
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:20:52.338835" 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-04-25T23:20:52.339209" elapsed="0.002185"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.341824" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:20:52.343694" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.341547" elapsed="0.002525">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:20:52.353820" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:20:52.354194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:20:52.352323" elapsed="0.001958"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.354616" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.354881" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:20:52.344921" elapsed="0.010100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:20:52.344333" elapsed="0.010737"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.328270" elapsed="0.026883">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.355474" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:20:52.355546" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.313480" elapsed="0.042169">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:20:52.355783" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:20:52.355826" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.309093" elapsed="0.046755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:20:52.356164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:20:52.355926" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-25T23:20:52.355907" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:20:52.308964" elapsed="0.047299"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:20:52.308777" elapsed="0.047518"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:20:52.306368" elapsed="0.049982"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:20:52.301858" elapsed="0.054563"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:20:52.301304" elapsed="0.055163"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:20:52.298641" elapsed="0.057878"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:20:52.358026" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-edit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-edit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:20:52.358202" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:20:52.357801" elapsed="0.000429"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:20:52.358308" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:20:52.358459" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:20:52.357482" elapsed="0.001003"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.362056" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:20:52.359247" elapsed="0.002866"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.363005" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:20:52.362255" elapsed="0.000804"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:20:52.366709" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:20:52.363220" elapsed="0.003552"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:20:52.358950" elapsed="0.007879"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.367589" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.366970" elapsed="60.001352">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.368435" elapsed="0.000040"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.358636" elapsed="60.009978">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.368695" elapsed="0.000018"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.357199" elapsed="60.011607">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.369061" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.369273" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.369437" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.369615" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.369697" elapsed="0.000017"/>
</return>
<arg>commit-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.356917" elapsed="60.012886">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:21:52.371198" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:21:52.370799" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.370777" elapsed="0.000509"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:21:52.371434" elapsed="0.000407"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.376914" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:21:52.376456" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:21:52.377162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.377019" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.377000" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.377685" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:21:52.377359" elapsed="0.000355"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:21:52.378142" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Edit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:21:52.377865" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:21:52.378605" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:21:52.378425" elapsed="0.000207"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.379153" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:21:52.378797" elapsed="0.000384"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.379639" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:21:52.379325" elapsed="0.000356"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.380283" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:21:52.379828" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.380794" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:21:52.380481" elapsed="0.000361"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:21:52.376158" elapsed="0.004741"/>
</kw>
<status status="PASS" start="2026-04-25T23:21:52.370560" elapsed="0.010389"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:21:52.370134" elapsed="0.010856"/>
</kw>
<doc>Commit the change and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:20:52.298070" elapsed="60.082961">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t9" name="First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit" line="100">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:21:52.384370" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:21:52.384121" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.385618" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.385506" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.385486" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.390162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.390057" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.390039" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.391202" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:21:52.390822" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.391688" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:21:52.391377" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:21:52.391760" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:21:52.391917" 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-04-25T23:21:52.390442" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.397170" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.397064" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.397045" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.398510" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.398404" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.398386" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:21:52.399102" 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-04-25T23:21:52.398735" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.399525" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:21:52.399276" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.400359" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.400087" elapsed="0.001188">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:21:52.401455" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:21:52.401511" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.399715" elapsed="0.001820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.402367" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.402094" elapsed="0.001288">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:21:52.403557" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:21:52.403603" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.401708" elapsed="0.001918"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.404540" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.403941" elapsed="0.000679">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:21:52.403729" elapsed="0.001003">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:21:52.403709" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.404917" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.405132" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:21:52.405003" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:21:52.404986" elapsed="0.000241"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.405259" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:21:52.408166" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:21:52.408386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:21:52.407445" elapsed="0.001035"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.409306" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.410144" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:21:52.406124" elapsed="0.004134"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:21:52.405534" elapsed="0.004839"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.398104" elapsed="0.012355">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</status>
</kw>
<msg time="2026-04-25T23:21:52.410561" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:21:52.410605" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.397377" elapsed="0.013252"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.410830" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.410722" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.410702" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.411976" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:21:52.411863" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.411841" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.412314" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:21:52.412417" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:21:52.412190" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.413008" level="INFO">{1: 48}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:21:52.412583" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:21:52.413450" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:21:52.413199" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:21:52.414078" elapsed="0.000327"/>
</kw>
<msg time="2026-04-25T23:21:52.414505" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:21:52.414551" 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-04-25T23:21:52.413713" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:21:52.415398" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.417508" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.417060" elapsed="0.001025">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.415924" elapsed="0.002238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:21:52.419503" elapsed="0.000519"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.418386" elapsed="0.001700"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:21:52.414896" elapsed="0.005309"/>
</kw>
<status status="PASS" start="2026-04-25T23:21:52.414674" elapsed="0.005583"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.414633" elapsed="0.005650"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:21:52.421271" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:21:52.420866" elapsed="0.000431"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:21:52.421346" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:21:52.421512" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:21:52.420484" elapsed="0.001053"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:21:52.421706" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.422394" level="INFO">index=49
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:21:52.422283" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:21:52.422666" elapsed="0.002073"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.425171" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:21:52.427500" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.424893" elapsed="0.003146">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:21:52.439292" elapsed="0.000466"/>
</kw>
<msg time="2026-04-25T23:21:52.439897" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:21:52.437237" elapsed="0.002790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.440464" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.440834" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:21:52.428822" elapsed="0.012211"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:21:52.428303" elapsed="0.012796"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.411310" elapsed="0.029905">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.442000" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:21:52.442105" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.396729" elapsed="0.045483">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:21:52.442316" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:21:52.442359" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.392315" elapsed="0.050067"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:21:52.442712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:21:52.442458" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-25T23:21:52.442440" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:21:52.392182" elapsed="0.050630"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:21:52.392000" elapsed="0.050844"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:21:52.389698" elapsed="0.053203"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:21:52.385206" elapsed="0.057751"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:21:52.384794" elapsed="0.058207"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:21:52.382123" elapsed="0.060932"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:21:52.444031" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:21:52.444205" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:21:52.443809" elapsed="0.000425"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:21:52.444278" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:21:52.444425" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:21:52.443489" elapsed="0.000964"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.448102" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:21:52.445195" elapsed="0.002964"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.449363" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:21:52.448301" elapsed="0.001116"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:21:52.457382" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:21:52.449610" elapsed="0.007884"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:21:52.444902" elapsed="0.012723"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.458389" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.457793" elapsed="60.001298">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.459200" elapsed="0.000038"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.444595" elapsed="60.014777">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.459434" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>get-config-edit-after-commit</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.443220" elapsed="60.016313">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:22:52.459785" elapsed="0.000029"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:22:52.461229" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:22:52.460824" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.460803" elapsed="0.000511"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:22:52.461457" elapsed="0.000401"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.466907" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:22:52.466456" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:22:52.467158" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.467013" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.466994" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.467676" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:22:52.467355" elapsed="0.000350"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:22:52.468116" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:22:52.467852" elapsed="0.000291"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:22:52.468464" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:22:52.468290" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.469007" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit"
reference s...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:22:52.468640" elapsed="0.000395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.469490" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_...</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:22:52.469178" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.470124" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:22:52.469674" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.470637" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:22:52.470322" elapsed="0.000447"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:22:52.466136" elapsed="0.004691"/>
</kw>
<status status="PASS" start="2026-04-25T23:22:52.460567" elapsed="0.010311"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:22:52.460158" elapsed="0.010761"/>
</kw>
<doc>Check that the change is now in the configuration.</doc>
<status status="FAIL" start="2026-04-25T23:21:52.381506" elapsed="60.089454">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t10" name="Terminate_Connection_Gracefully" line="105">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:22:52.474783" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:22:52.474508" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.476006" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.475897" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.475879" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.480521" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.480397" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.480378" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.481568" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:22:52.481183" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.482052" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:22:52.481757" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:22:52.482122" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:22:52.482278" 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-04-25T23:22:52.480816" elapsed="0.001486"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.487574" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.487467" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.487447" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.489014" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.488905" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.488885" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:22:52.489589" level="INFO">${karaf_connection_index} = 49</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:22:52.489214" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.490033" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:22:52.489781" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.490895" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.490577" elapsed="0.001237">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:22:52.491995" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:22:52.492040" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.490203" elapsed="0.001860"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.492906" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.492596" elapsed="0.001344">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:22:52.494117" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:22:52.494162" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.492218" elapsed="0.002000"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.495146" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.494504" elapsed="0.000724">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:22:52.494297" elapsed="0.001026">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:22:52.494277" elapsed="0.001080">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.495506" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.495753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:22:52.495611" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:22:52.495593" elapsed="0.000270"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.495900" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:22:52.498929" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:22:52.499152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:22:52.498182" elapsed="0.001065"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.500062" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.501031" elapsed="0.000040"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:22:52.496776" elapsed="0.004377"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:22:52.496157" elapsed="0.005114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.488448" elapsed="0.012907">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</status>
</kw>
<msg time="2026-04-25T23:22:52.501457" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:22:52.501501" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Terminate_Connection_Gracefully"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.487798" elapsed="0.013727"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.501753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.501602" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.501582" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.504211" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:22:52.504104" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.504086" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.504538" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:22:52.504640" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:22:52.504418" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.505099" level="INFO">{1: 49}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:22:52.504839" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:22:52.505528" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:22:52.505283" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:22:52.506234" elapsed="0.000325"/>
</kw>
<msg time="2026-04-25T23:22:52.506675" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:22:52.506747" level="INFO">${old_connection_index} = 49</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.505885" 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-04-25T23:22:52.507558" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.509602" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.509177" elapsed="0.001020">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.508001" elapsed="0.002274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:22:52.511671" elapsed="0.000365"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.510502" elapsed="0.001597"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:22:52.507059" elapsed="0.005144"/>
</kw>
<status status="PASS" start="2026-04-25T23:22:52.506849" elapsed="0.005406"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.506830" elapsed="0.005451"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:22:52.513224" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:22:52.512816" elapsed="0.000435"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:22:52.513300" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:22:52.513454" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:22:52.512474" elapsed="0.001004"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:22:52.513622" elapsed="0.000477"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.514365" level="INFO">index=50
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:22:52.514256" 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-04-25T23:22:52.514630" elapsed="0.002083"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.517128" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:22:52.519349" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.516866" elapsed="0.002872">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:22:52.532382" elapsed="0.000341"/>
</kw>
<msg time="2026-04-25T23:22:52.532786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:22:52.530490" elapsed="0.002390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.533198" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.533447" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:22:52.520500" elapsed="0.013269"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:22:52.520000" elapsed="0.013821"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.503808" elapsed="0.030099">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.534252" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:22:52.534327" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.487124" elapsed="0.047312">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:22:52.534544" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:22:52.534588" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.482700" elapsed="0.051912"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:22:52.535160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:22:52.534897" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-25T23:22:52.534876" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:22:52.482537" elapsed="0.052725"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:22:52.482357" elapsed="0.052937"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:22:52.480041" elapsed="0.055308"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:22:52.475596" elapsed="0.059810"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:22:52.475185" elapsed="0.060266"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:22:52.472114" elapsed="0.063389"/>
</kw>
<kw name="Close_ODL_Netconf_Connection_Gracefully">
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:22:52.537036" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/close-session-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/close-session-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:22:52.537217" level="INFO">${data} = &lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;close-session/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:22:52.536812" elapsed="0.000434"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:22:52.537291" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:22:52.537441" level="INFO">${request} = &lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;close-session/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:22:52.536486" elapsed="0.000982"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.540831" level="INFO">&lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:22:52.538233" elapsed="0.002655"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.541797" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:22:52.541030" elapsed="0.000822"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:22:52.545296" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;close-session/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:22:52.541992" elapsed="0.003365"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:22:52.537931" elapsed="0.007481"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.546165" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.545551" elapsed="60.001344">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.547012" elapsed="0.000038"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.537609" elapsed="60.009574">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.547253" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.536200" elapsed="60.011156">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.547619" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.547851" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.548040" elapsed="0.000022"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.548202" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.548266" elapsed="0.000017"/>
</return>
<arg>close-session</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.535930" elapsed="60.012441">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Abort_ODL_Netconf_Connection">
<doc>Correctly close the Netconf connection and make sure it is really dead.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.548711" elapsed="0.000025"/>
</kw>
<status status="FAIL" start="2026-04-25T23:22:52.535641" elapsed="60.013184">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:23:52.550502" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:23:52.550093" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.549770" elapsed="0.000820"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:23:52.550746" elapsed="0.000382"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.555857" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:23:52.555405" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:23:52.556131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.555982" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.555942" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.556629" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:23:52.556329" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:23:52.557087" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Terminate_Connection_Gracefully</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.556820" elapsed="0.000294"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:23:52.557439" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:23:52.557262" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.557981" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:23:52.557616" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.558463" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:23:52.558152" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.559103" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:23:52.558634" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.559600" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:23:52.559303" elapsed="0.000359"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:23:52.555109" elapsed="0.004617"/>
</kw>
<status status="PASS" start="2026-04-25T23:23:52.549534" elapsed="0.010245"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:23:52.549144" elapsed="0.010678"/>
</kw>
<doc>Close the session and disconnect.</doc>
<status status="FAIL" start="2026-04-25T23:22:52.471462" elapsed="60.088400">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t11" name="Reconnect_To_ODL_Netconf_After_Graceful_Session_End" line="109">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:23:52.563129" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:23:52.562881" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.564383" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.564274" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.564256" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.568924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.568817" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.568798" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.569964" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:23:52.569568" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.570431" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:23:52.570137" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:23:52.570501" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:23:52.570672" 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-04-25T23:23:52.569204" elapsed="0.001494"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.575962" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.575853" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.575834" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.577263" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.577155" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.577136" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:23:52.577875" level="INFO">${karaf_connection_index} = 50</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.577465" elapsed="0.000438"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.578305" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:23:52.578053" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.579152" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.578880" elapsed="0.001199">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:23:52.580260" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:23:52.580307" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.578481" elapsed="0.001850"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.581165" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.580891" elapsed="0.001320">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:23:52.582388" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:23:52.582433" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.580488" elapsed="0.001968"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.583351" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.582755" elapsed="0.000675">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:23:52.582531" elapsed="0.000990">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:23:52.582512" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.583721" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.583986" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:23:52.583842" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:23:52.583824" elapsed="0.000260"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.584117" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:23:52.586939" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:23:52.587160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:23:52.586289" 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-04-25T23:23:52.588080" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.588907" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:23:52.584950" elapsed="0.004070"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:23:52.584369" elapsed="0.004768"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.576849" elapsed="0.012373">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</status>
</kw>
<msg time="2026-04-25T23:23:52.589325" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:23:52.589369" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Graceful_Session_End"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.576180" elapsed="0.013214"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.589580" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.589472" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.589452" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.590736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:23:52.590607" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.590587" elapsed="0.000218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.591065" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:23:52.591168" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:23:52.590947" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.591593" level="INFO">{1: 50}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:23:52.591335" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:23:52.592058" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:23:52.591796" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.592596" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:23:52.593027" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:23:52.593074" level="INFO">${old_connection_index} = 50</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.592248" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:23:52.594004" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.595969" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.595534" elapsed="0.000999">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.594388" elapsed="0.002222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:23:52.598072" elapsed="0.000355"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.596853" elapsed="0.001636"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:23:52.593385" elapsed="0.005205"/>
</kw>
<status status="PASS" start="2026-04-25T23:23:52.593174" elapsed="0.005512"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.593155" elapsed="0.005560"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:23:52.599629" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.599223" elapsed="0.000447"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:23:52.599720" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:23:52.599872" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:23:52.598909" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.600064" elapsed="0.000412"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.600758" level="INFO">index=51
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:23:52.600634" elapsed="0.000252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:23:52.601022" elapsed="0.002075"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.603508" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:23:52.605899" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.603249" elapsed="0.003023">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:23:52.616428" elapsed="0.000540"/>
</kw>
<msg time="2026-04-25T23:23:52.617051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:23:52.614775" 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-04-25T23:23:52.617620" elapsed="0.000278"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.618217" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:23:52.607054" elapsed="0.011358"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:23:52.606535" elapsed="0.011946"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.590145" elapsed="0.028448">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.619059" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:23:52.619159" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.575494" elapsed="0.043809">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:23:52.619448" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:23:52.619509" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.571073" elapsed="0.048468"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:23:52.620034" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:23:52.619666" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-25T23:23:52.619622" elapsed="0.000521"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:23:52.570942" elapsed="0.049233"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:23:52.570762" elapsed="0.049454"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:23:52.568443" elapsed="0.051849"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:23:52.563985" elapsed="0.056383"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:23:52.563529" elapsed="0.056902"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:23:52.560872" elapsed="0.059697"/>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<kw name="Reopen_ODL_Netconf_Connection">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:23:52.626883" level="INFO">sshpass -p admin ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@127.0.0.1 -p 2830 -s netconf</msg>
<arg>sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:23:52.621523" elapsed="0.005596"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.628770" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${hello}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.627625" elapsed="60.001835">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_control}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.629771" elapsed="0.000042"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${pid}</var>
<arg>ps -A | grep sshpass | awk '{print $1}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.629970" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf_pid}</arg>
<arg>${pid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.630146" elapsed="0.000021"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_netconf}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.630300" elapsed="0.000021"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.630364" elapsed="0.000022"/>
</return>
<var>${hello}</var>
<doc>Reopen a closed netconf connection.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.621178" elapsed="60.009328">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Get_Data">
<var>${hello_message}</var>
<arg>hello</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.630732" elapsed="0.000025"/>
</kw>
<kw name="Transmit_Message">
<arg>${hello_message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.630887" elapsed="0.000022"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.630948" elapsed="0.000016"/>
</return>
<doc>Open a prepared netconf connecion.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.620799" elapsed="60.010251">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:24:52.632410" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:24:52.632019" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.631997" elapsed="0.000500"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:24:52.632632" elapsed="0.000395"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.638112" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:24:52.637630" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:24:52.638366" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.638222" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.638203" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.638886" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:24:52.638566" elapsed="0.000347"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:24:52.639334" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Reconnect_To_ODL_Netconf_After_Graceful_Session_End</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:24:52.639061" elapsed="0.000300"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:24:52.639713" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:24:52.639510" elapsed="0.000231"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.640248" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end"
reference somewher...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:24:52.639892" elapsed="0.000384"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.640746" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:24:52.640421" elapsed="0.000446"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.641471" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:24:52.641017" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.641986" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:24:52.641686" elapsed="0.000349"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:24:52.637330" elapsed="0.004760"/>
</kw>
<status status="PASS" start="2026-04-25T23:24:52.631797" elapsed="0.010344"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:24:52.631368" elapsed="0.010815"/>
</kw>
<doc>Reconnect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-25T23:23:52.560280" elapsed="60.081944">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t12" name="First_Batch_In_Config_Running_After_Reconnect" line="113">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:24:52.646251" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:24:52.646000" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.647495" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.647383" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.647364" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.652080" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.651974" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.651955" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.653156" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:24:52.652767" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.653622" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:24:52.653330" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:24:52.653715" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:24:52.653871" 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-04-25T23:24:52.652361" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.659149" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.659042" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.659023" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.660441" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.660334" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.660316" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:24:52.661058" level="INFO">${karaf_connection_index} = 51</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:24:52.660646" elapsed="0.000445"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.661497" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:24:52.661242" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.662429" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.662156" elapsed="0.001191">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:24:52.663531" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:24:52.663577" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.661728" elapsed="0.001874"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.664440" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.664163" elapsed="0.001296">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:24:52.665636" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:24:52.665710" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.663784" elapsed="0.001952"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.666623" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.666020" elapsed="0.000700">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:24:52.665812" elapsed="0.001003">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:24:52.665793" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.667002" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.667219" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:24:52.667089" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:24:52.667071" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.667345" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:24:52.670292" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:24:52.670515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:24:52.669541" elapsed="0.001070"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.671538" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.672375" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:24:52.668213" elapsed="0.004276"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:24:52.667597" elapsed="0.005008"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.660031" elapsed="0.012676">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</status>
</kw>
<msg time="2026-04-25T23:24:52.672813" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:24:52.672857" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.First_Batch_In_Config_Running_After_Reconnect"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.659353" elapsed="0.013528"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.673101" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.672967" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.672944" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.674282" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:24:52.674170" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.674150" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.674614" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:24:52.674734" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:24:52.674492" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.675208" level="INFO">{1: 51}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:24:52.674941" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:24:52.675639" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:24:52.675395" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:24:52.676224" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:24:52.676643" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:24:52.676706" level="INFO">${old_connection_index} = 51</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.675876" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:24:52.677511" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.679572" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.679155" elapsed="0.000978">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.677946" elapsed="0.002263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:24:52.681563" elapsed="0.000488"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.680430" elapsed="0.001685"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:24:52.677017" elapsed="0.005198"/>
</kw>
<status status="PASS" start="2026-04-25T23:24:52.676807" elapsed="0.005459"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.676788" elapsed="0.005504"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:24:52.683218" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:24:52.682817" elapsed="0.000428"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:24:52.683293" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:24:52.683444" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:24:52.682488" elapsed="0.000980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:24:52.683616" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.684334" level="INFO">index=52
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:24:52.684227" 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-04-25T23:24:52.684594" elapsed="0.002218"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.687231" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:24:52.689016" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.686969" elapsed="0.002415">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:24:52.698917" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:24:52.699291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:24:52.697590" elapsed="0.001928"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.699883" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.700135" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:24:52.690274" elapsed="0.010001"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:24:52.689642" elapsed="0.010682"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.673549" elapsed="0.026896">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.700789" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:24:52.700864" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.658701" elapsed="0.042266">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:24:52.701070" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:24:52.701113" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.654260" elapsed="0.046876"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:24:52.701451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:24:52.701212" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-25T23:24:52.701194" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:24:52.654129" elapsed="0.047421"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:24:52.653952" elapsed="0.047629"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:24:52.651580" elapsed="0.050055"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:24:52.647091" elapsed="0.054835"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:24:52.646670" elapsed="0.055303"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:24:52.643512" elapsed="0.058513"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:24:52.702995" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:24:52.703156" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:24:52.702770" elapsed="0.000414"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:24:52.703229" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:24:52.703375" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:24:52.702451" elapsed="0.000956"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.707421" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="5"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:24:52.704178" elapsed="0.003300"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.708367" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:24:52.707620" elapsed="0.000798"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:24:52.716608" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:24:52.708578" elapsed="0.008118"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:24:52.703870" elapsed="0.012884"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.717455" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.716893" elapsed="60.001287">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.718388" elapsed="0.000035"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.703549" elapsed="60.015005">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.718621" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>get-config-edit-after-commit</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.702182" elapsed="60.016552">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:25:52.718958" elapsed="0.000027"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:25:52.720414" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:25:52.719990" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.719968" elapsed="0.000534"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:25:52.720665" elapsed="0.000401"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.726111" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:25:52.725628" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:25:52.726363" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.726218" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.726198" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.726882" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:25:52.726562" elapsed="0.000347"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:25:52.727327" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_First_Batch_In_Config_Running_After_Reconnect</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.727055" elapsed="0.000298"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:25:52.727691" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:25:52.727501" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.728218" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect"
reference somewhere insi...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:25:52.727869" elapsed="0.000380"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.728717" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:25:52.728393" elapsed="0.000353"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.729335" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:25:52.728888" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.729861" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:25:52.729536" elapsed="0.000375"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:25:52.725331" elapsed="0.004636"/>
</kw>
<status status="PASS" start="2026-04-25T23:25:52.719760" elapsed="0.010257"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:25:52.719325" elapsed="0.010772"/>
</kw>
<doc>Check that the change is now in the configuration.</doc>
<status status="FAIL" start="2026-04-25T23:24:52.642860" elapsed="60.087279">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t13" name="Edit_Config_Create_Shall_Fail_Now" line="118">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:25:52.733586" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:25:52.733335" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.734872" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.734751" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.734732" elapsed="0.000208"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.739373" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.739259" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.739241" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.740422" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:25:52.740037" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.740910" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:25:52.740596" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:25:52.740980" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:25:52.741137" 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-04-25T23:25:52.739666" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.746438" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.746327" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.746308" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.748349" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.748241" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.748223" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:25:52.748929" level="INFO">${karaf_connection_index} = 52</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.748549" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.749350" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:25:52.749101" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.750209" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.749933" elapsed="0.001295">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:25:52.751408" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:25:52.751453" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.749520" elapsed="0.001957"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.752314" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.752038" elapsed="0.001338">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:25:52.753553" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:25:52.753599" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.751631" elapsed="0.001992"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.754542" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.753932" elapsed="0.000688">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:25:52.753713" elapsed="0.001052">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:25:52.753693" elapsed="0.001109">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.754950" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.755166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:25:52.755036" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:25:52.755019" elapsed="0.000244"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.755296" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:25:52.758175" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:25:52.758395" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:25:52.757485" elapsed="0.001005"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.759287" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.760167" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:25:52.756158" elapsed="0.004128"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:25:52.755550" 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="FAIL" start="2026-04-25T23:25:52.747938" elapsed="0.012544">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</status>
</kw>
<msg time="2026-04-25T23:25:52.760584" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:25:52.760629" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Create_Shall_Fail_Now"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.746647" elapsed="0.014021"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.760860" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.760752" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.760728" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.763233" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:25:52.763125" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.763108" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.763559" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:25:52.763753" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:25:52.763440" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.764187" level="INFO">{1: 52}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:25:52.763924" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:25:52.764617" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:25:52.764370" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.765169" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:25:52.765586" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:25:52.765631" level="INFO">${old_connection_index} = 52</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.764823" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:25:52.766486" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.768574" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.768155" elapsed="0.000971">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.766889" elapsed="0.002313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:25:52.770564" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.769431" elapsed="0.001607"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:25:52.765985" elapsed="0.005157"/>
</kw>
<status status="PASS" start="2026-04-25T23:25:52.765747" elapsed="0.005445"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.765727" elapsed="0.005491"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:25:52.772183" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.771777" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:25:52.772264" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:25:52.772417" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:25:52.771409" elapsed="0.001033"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.772586" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.773282" level="INFO">index=53
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:25:52.773168" elapsed="0.000240"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:25:52.773544" elapsed="0.002054"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.776084" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:25:52.777949" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.775822" elapsed="0.002505">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:25:52.790462" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:25:52.790854" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:25:52.788775" elapsed="0.002167"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.791259" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.791506" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:25:52.779109" elapsed="0.012539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:25:52.778590" elapsed="0.013428"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.762829" elapsed="0.029273">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.792421" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:25:52.792495" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.745983" elapsed="0.046615">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:25:52.792717" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:25:52.792761" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.741524" elapsed="0.051260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:25:52.793103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:25:52.792862" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-25T23:25:52.792844" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:25:52.741394" elapsed="0.051808"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:25:52.741218" elapsed="0.052015"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:25:52.738901" elapsed="0.054422"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:25:52.734446" elapsed="0.058933"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:25:52.734028" elapsed="0.059395"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:25:52.731297" elapsed="0.062177"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:25:52.794776" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/create-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/create-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:25:52.794945" level="INFO">${data} = &lt;rpc message-id="15" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;create&lt;/default-operation&gt;
&lt;config&gt;
&lt;people xmlns="urn:opendaylig...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:25:52.794538" elapsed="0.000436"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:25:52.795020" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:25:52.795170" level="INFO">${request} = &lt;rpc message-id="15" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;create&lt;/default-operation&gt;
&lt;config&gt;
&lt;people xmlns="urn:opendaylig...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:25:52.794236" elapsed="0.000962"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.801520" level="INFO">&lt;rpc message-id="15" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:25:52.795997" elapsed="0.005682"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.803715" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:25:52.802033" elapsed="0.001800"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:25:52.825641" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;create&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTBAD&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;99&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `99'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:25:52.804147" elapsed="0.021591"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:25:52.795699" elapsed="0.030099"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.826555" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.825960" elapsed="60.001293">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.827371" elapsed="0.000041"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.795339" elapsed="60.032214">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.827618" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.793942" elapsed="60.033795">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.827994" elapsed="0.000029"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.828211" elapsed="0.000091"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.828450" elapsed="0.000022"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.828618" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.828701" elapsed="0.000017"/>
</return>
<arg>create</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:25:52.793639" elapsed="60.035169">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:26:52.830194" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:52.829797" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.829776" elapsed="0.000505"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:52.830422" elapsed="0.000401"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.835860" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:26:52.835407" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:26:52.836122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.835976" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.835957" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.836624" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:26:52.836320" elapsed="0.000345"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:26:52.837090" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Create_Shall_Fail_Now</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:26:52.836815" elapsed="0.000302"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:26:52.837441" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:26:52.837265" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.838043" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:26:52.837689" elapsed="0.000381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.838526" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:26:52.838215" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.839161" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:26:52.838711" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.839668" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:52.839359" elapsed="0.000359"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:26:52.835110" elapsed="0.004664"/>
</kw>
<status status="PASS" start="2026-04-25T23:26:52.829560" elapsed="0.010264"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:26:52.829139" elapsed="0.010736"/>
</kw>
<doc>Request a "create" operation of an element that already exists and check that it fails with the correct error (RFC 6241, section 7.2, operation "create").</doc>
<status status="FAIL" start="2026-04-25T23:25:52.730623" elapsed="60.109328">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t14" name="Delete_First_Batch" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:26:52.844010" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:26:52.843728" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.845272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.845154" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.845134" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.849783" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.849674" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.849644" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.850826" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:26:52.850427" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.851299" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:26:52.851003" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:26:52.851370" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:26:52.851529" 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-04-25T23:26:52.850065" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.856854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.856744" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.856725" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.858136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.858030" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.858012" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:26:52.858717" 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-04-25T23:26:52.858335" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.859143" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:52.858893" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.860014" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.859711" elapsed="0.001255">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:26:52.861149" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:26:52.861195" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.859318" elapsed="0.001900"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.862044" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.861767" elapsed="0.001305">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:26:52.863250" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:26:52.863297" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.861375" elapsed="0.001946"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.864243" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.863606" elapsed="0.000718">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:26:52.863397" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:26:52.863377" elapsed="0.001117">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.864645" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.864880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:52.864750" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:26:52.864732" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.865010" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:52.867935" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:26:52.868164" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:52.867190" elapsed="0.001069"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.869186" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.870037" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:26:52.865850" elapsed="0.004302"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:26:52.865263" elapsed="0.005004"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.857728" elapsed="0.012625">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</status>
</kw>
<msg time="2026-04-25T23:26:52.870457" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:26:52.870502" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_First_Batch"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.857061" elapsed="0.013465"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.870758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.870604" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.870584" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.871850" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:52.871727" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.871705" elapsed="0.000214"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.872192" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:26:52.872296" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:26:52.872061" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.872742" level="INFO">{1: 53}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:52.872465" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:52.873183" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:52.872929" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:26:52.873844" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:26:52.874280" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:26:52.874328" level="INFO">${old_connection_index} = 53</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.873375" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:52.875152" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.877137" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.876723" elapsed="0.001117">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.875538" elapsed="0.002379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:26:52.879241" 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-04-25T23:26:52.878140" elapsed="0.001572"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:26:52.874638" elapsed="0.005205"/>
</kw>
<status status="PASS" start="2026-04-25T23:26:52.874429" elapsed="0.005466"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.874410" elapsed="0.005511"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:26:52.880847" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:26:52.880425" elapsed="0.000449"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:26:52.880923" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:26:52.881075" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:26:52.880117" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:26:52.881241" elapsed="0.000426"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.881936" level="INFO">index=54
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:26:52.881828" 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-04-25T23:26:52.882197" elapsed="0.002161"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.884784" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:26:52.886746" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.884510" elapsed="0.002610">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:52.896642" elapsed="0.000349"/>
</kw>
<msg time="2026-04-25T23:26:52.897051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:52.895311" elapsed="0.001829"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.897591" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.898149" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:26:52.888013" elapsed="0.010277"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:26:52.887379" elapsed="0.010959"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.871203" elapsed="0.027218">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.898756" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:26:52.898830" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.856390" elapsed="0.042543">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:26:52.899039" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:26:52.899082" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.851954" elapsed="0.047152"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:52.899419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:52.899181" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:52.899164" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:26:52.851809" elapsed="0.047709"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:26:52.851613" elapsed="0.047937"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:26:52.849303" elapsed="0.050339"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:26:52.844862" elapsed="0.054863"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:52.844419" elapsed="0.055351"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:26:52.841240" elapsed="0.058582"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:26:52.901137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:26:52.901295" level="INFO">${data} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:26:52.900916" elapsed="0.000409"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:26:52.901371" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:26:52.901527" level="INFO">${request} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:26:52.900582" elapsed="0.000981"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.906491" level="INFO">&lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:26:52.902393" elapsed="0.004169"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:52.907560" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:26:52.906765" elapsed="0.000849"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:26:53.475411" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=netconf
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:26:52.907808" elapsed="0.568159"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:26:52.902096" elapsed="0.573936"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.371348" level="INFO">COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:26:54.372121" level="INFO">${reply} = 
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            ...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:26:53.476185" elapsed="0.895966"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:26:54.372203" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:26:54.372368" level="INFO">${reply} = 
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            ...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:26:52.901800" elapsed="1.470595"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:26:54.372439" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:26:54.372582" level="INFO">${actual} = 
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            ...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:26:52.900288" elapsed="1.472322"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:26:54.373667" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:26:54.373833" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:26:54.373424" elapsed="0.000438"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:26:54.373908" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:26:54.374056" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:26:54.373109" elapsed="0.000974"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:26:54.374126" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:26:54.374272" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:26:54.372788" elapsed="0.001511"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:26:54.374715" level="INFO">${actual} = 
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.374441" elapsed="0.000303"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:26:54.375129" level="INFO">${actual} = COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:26:54.374891" elapsed="0.000267"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:26:54.376523" level="FAIL">OSError: [Errno 36] File name too long: 'COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-collect () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-collect)\r\n            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))\r\n        ;;\r\n        -p | --package)\r\n            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))\r\n        ;;\r\n        --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            if [[ "${COMP_WORDS[*]}" =~ .*\\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then\r\n                COMPREPLY=($( compgen -W "--tag" -- $cur));\r\n            else\r\n                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));\r\n            fi\r\n        ;;\r\n    esac\r\n}\r\n_apport-unpack () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-unpack)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n    esac\r\n}\r\n_apport_parameterless () \r\n{ \r\n    local param;\r\n    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";\r\n    COMPREPLY=($( compgen -W "$param" -- $cur))\r\n}\r\n_apport_symptoms () \r\n{ \r\n    local syms;\r\n    if [ -r /usr/share/apport/symptoms ]; then\r\n        for FILE in $(ls /usr/share/apport/symptoms);\r\n        do\r\n            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\\s*\\(.*\\):" /usr/share/apport/symptoms/$FILE) ]]; then\r\n                syms="$syms ${FILE%.py}";\r\n            fi;\r\n        done;\r\n    fi;\r\n    echo $syms\r\n}\r\n_available_interfaces () \r\n{ \r\n    local PATH=$PATH:/sbin;\r\n    COMPREPLY=($({\r\n        if [[ ${1:-} == -w ]]; then\r\n            iwconfig\r\n        elif [[ ${1:-} == -a ]]; then\r\n            ifconfig || ip link show up\r\n        else\r\n            ifconfig -a || ip link show\r\n        fi\r\n    } 2&gt;/dev/null | awk         \'/^[^ \\t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }\'));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]/%[[:punct:]]/}\' -- "$cur"))\r\n}\r\n_bashcomp_try_faketty () \r\n{ \r\n    if type unbuffer &amp;&gt; /dev/null; then\r\n        unbuffer -p "$@";\r\n    else\r\n        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then\r\n            script -qaefc "$*" /dev/null;\r\n        else\r\n            "$@";\r\n        fi;\r\n    fi\r\n}\r\n_cd () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    local IFS=\'\r\n\' i j k;\r\n    compopt -o filenames;\r\n    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then\r\n        _filedir -d;\r\n        return;\r\n    fi;\r\n    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);\r\n    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);\r\n    for i in ${CDPATH//:/\'\r\n\'};\r\n    do\r\n        k="${#COMPREPLY[@]}";\r\n        for j in $(compgen -d -- $i/$cur);\r\n        do\r\n            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then\r\n                j+="/";\r\n            fi;\r\n            COMPREPLY[k++]=${j#$i/};\r\n        done;\r\n    done;\r\n    _filedir -d;\r\n    if ((${#COMPREPLY[@]} == 1)); then\r\n        i=${COMPREPLY[0]};\r\n        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then\r\n            COMPREPLY[0]="${i}/";\r\n        fi;\r\n    fi;\r\n    return\r\n}\r\n_cd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))\r\n}\r\n_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.375315" elapsed="0.003921">OSError: [Errno 36] File name too long: 'COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n               ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.379328" elapsed="0.000300"/>
</return>
<arg>delete</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.899994" elapsed="1.479779">OSError: [Errno 36] File name too long: 'COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n               ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:26:54.381086" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:54.380704" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.380684" elapsed="0.000488"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:54.381310" elapsed="0.000325"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.389811" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:26:54.385961" elapsed="0.003879"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:26:54.390063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.389918" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.389899" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.390573" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:26:54.390268" elapsed="0.000332"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:26:54.391026" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Delete_First_Batch</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.390763" elapsed="0.000290"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:26:54.391392" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:26:54.391215" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.391931" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:26:54.391561" elapsed="0.000397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.392414" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:26:54.392102" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.393046" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n               ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:26:54.392586" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.393599" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:54.393271" elapsed="0.000394"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:26:54.385666" elapsed="0.008059"/>
</kw>
<status status="PASS" start="2026-04-25T23:26:54.380474" elapsed="0.013333"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:26:54.380111" elapsed="0.013740"/>
</kw>
<doc>Delete the created element from the candidate configuration and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:26:52.840599" elapsed="1.553293">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n               ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t15" name="Get_Config_Running_To_Confirm_No_Delete_Before_Commit" line="126">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:26:54.398025" elapsed="0.000240"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:26:54.397637" elapsed="0.000684"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.399313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.399199" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.399179" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.403846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.403740" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.403723" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.404878" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:26:54.404484" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.405443" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:26:54.405055" elapsed="0.000414"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:26:54.405514" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:26:54.405686" 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-04-25T23:26:54.404124" elapsed="0.001588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.410920" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.410812" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.410793" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.412218" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.412112" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.412094" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:26:54.412832" level="INFO">${karaf_connection_index} = 54</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.412418" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.413260" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:54.413009" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.414093" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.413823" elapsed="0.001170">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:26:54.415187" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:26:54.415232" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.413433" elapsed="0.001827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.416093" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.415817" elapsed="0.001311">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:26:54.417308" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:26:54.417354" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.415416" elapsed="0.001962"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.418295" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.417683" elapsed="0.000692">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:26:54.417455" elapsed="0.001015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:26:54.417436" elapsed="0.001068">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.418666" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.418883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:54.418754" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:26:54.418737" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.419011" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:54.421903" elapsed="0.000154"/>
</kw>
<msg time="2026-04-25T23:26:54.422128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:54.421234" elapsed="0.000989"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.423028" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.423878" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:26:54.419864" elapsed="0.004127"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:26:54.419277" elapsed="0.004831"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.411810" elapsed="0.012382">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</status>
</kw>
<msg time="2026-04-25T23:26:54.424295" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:26:54.424338" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_No_Delete_Before_Commit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.411149" elapsed="0.013213"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.424550" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.424443" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.424424" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.425803" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:26:54.425695" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.425676" elapsed="0.000227"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.426166" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:26:54.426270" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:26:54.426046" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.426817" level="INFO">{1: 54}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:54.426437" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:26:54.427268" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:26:54.427003" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.427828" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:26:54.428248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:26:54.428294" level="INFO">${old_connection_index} = 54</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.427459" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:54.429236" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.431207" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.430774" elapsed="0.000991">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.429622" elapsed="0.002220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:26:54.433183" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.432069" elapsed="0.001541"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:26:54.428604" elapsed="0.005135"/>
</kw>
<status status="PASS" start="2026-04-25T23:26:54.428394" elapsed="0.005397"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.428375" elapsed="0.005442"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:26:54.434734" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.434317" elapsed="0.000444"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:26:54.434814" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:26:54.434967" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:26:54.434007" elapsed="0.000984"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:26:54.435160" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.435854" level="INFO">index=55
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:26:54.435747" 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-04-25T23:26:54.436117" elapsed="0.002102"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.438627" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:26:54.439682" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.438370" elapsed="0.001682">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:26:54.449478" elapsed="0.000384"/>
</kw>
<msg time="2026-04-25T23:26:54.449921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:26:54.448318" 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-04-25T23:26:54.450328" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.450611" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:26:54.440820" elapsed="0.009954"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:26:54.440310" elapsed="0.010513"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.425210" elapsed="0.025695">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.451234" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:26:54.451307" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.410461" elapsed="0.040950">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:26:54.451518" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:26:54.451562" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.406075" elapsed="0.045510"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:26:54.452224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:26:54.451981" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-25T23:26:54.451645" elapsed="0.000656"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:26:54.405943" elapsed="0.046381"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:26:54.405768" elapsed="0.046586"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:26:54.403365" elapsed="0.049043"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:26:54.398893" elapsed="0.053571"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:26:54.398460" elapsed="0.054049"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:26:54.395411" elapsed="0.057151"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:26:54.453522" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-no-delete-before-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-no-delete-before-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:26:54.453678" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:26:54.453305" elapsed="0.000402"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:26:54.453754" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:26:54.453902" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:26:54.453001" elapsed="0.000928"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:26:54.454670" elapsed="0.000291"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.455804" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:26:54.455118" elapsed="0.000737"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:26:54.468518" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:26:54.455992" elapsed="0.012605"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:26:54.454361" elapsed="0.014344"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.469378" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.468845" elapsed="60.001221">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.470184" elapsed="0.000038"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.454070" elapsed="60.016284">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.470417" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>get-config-no-delete-before-commit</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.452730" elapsed="60.017786">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:27:54.470784" elapsed="0.000029"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:27:54.472213" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:27:54.471823" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.471802" elapsed="0.000496"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:27:54.472440" elapsed="0.000400"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.479230" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:27:54.478794" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:27:54.479479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.479335" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.479316" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.479993" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:27:54.479687" elapsed="0.000334"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:27:54.480437" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_Config_Running_To_Confirm_No_Delete_Before_Commit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:27:54.480166" elapsed="0.000298"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:27:54.480799" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:27:54.480609" elapsed="0.000216"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.481313" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit"
reference somewh...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:27:54.480969" elapsed="0.000371"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.481805" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_statu...</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:27:54.481480" elapsed="0.000354"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.482429" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:27:54.481974" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.482934" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:27:54.482623" elapsed="0.000358"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:27:54.478481" elapsed="0.004618"/>
</kw>
<status status="PASS" start="2026-04-25T23:27:54.471589" elapsed="0.011562"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:27:54.471155" elapsed="0.012038"/>
</kw>
<doc>Make sure the element is still present in the running configuration as the delete command was not committed yet.</doc>
<status status="FAIL" start="2026-04-25T23:26:54.394600" elapsed="60.088633">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t16" name="Commit_Delete" line="131">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:27:54.487053" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:27:54.486805" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.488273" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.488163" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.488144" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.492796" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.492688" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.492669" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.493832" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:27:54.493436" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.494318" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:27:54.494012" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:27:54.494387" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:27:54.494543" 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-04-25T23:27:54.493075" 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-04-25T23:27:54.499797" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.499687" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.499667" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.501086" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.500981" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.500963" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:27:54.501650" level="INFO">${karaf_connection_index} = 55</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:27:54.501284" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.502088" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:27:54.501839" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.502946" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.502664" elapsed="0.001212">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:27:54.504057" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:27:54.504103" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.502272" elapsed="0.001854"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.504975" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.504692" elapsed="0.001325">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:27:54.506218" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:27:54.506263" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.504283" elapsed="0.002036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.507233" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.506605" elapsed="0.000708">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:27:54.506398" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:27:54.506378" elapsed="0.001064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.507590" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.507824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:27:54.507694" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:27:54.507675" elapsed="0.000247"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.507954" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:27:54.510935" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:27:54.511160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:27:54.510193" elapsed="0.001062"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.512064" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.513023" elapsed="0.000047"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:27:54.508801" elapsed="0.004352"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:27:54.508208" elapsed="0.005064"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.500679" elapsed="0.012679">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</status>
</kw>
<msg time="2026-04-25T23:27:54.513462" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:27:54.513506" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.500009" elapsed="0.013520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.513803" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.513607" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.513588" elapsed="0.000285"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.514866" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:27:54.514751" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.514730" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.515210" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:27:54.515315" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:27:54.515080" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.515760" level="INFO">{1: 55}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:27:54.515483" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:27:54.516192" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:27:54.515946" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:27:54.516760" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:27:54.517182" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:27:54.517229" level="INFO">${old_connection_index} = 55</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.516385" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:27:54.518223" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.520234" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.519812" elapsed="0.000989">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.518608" elapsed="0.002270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:27:54.522261" 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-04-25T23:27:54.521102" elapsed="0.001597"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:27:54.517539" elapsed="0.005263"/>
</kw>
<status status="PASS" start="2026-04-25T23:27:54.517328" elapsed="0.005526"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.517310" elapsed="0.005570"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:27:54.523803" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:27:54.523381" elapsed="0.000448"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:27:54.523878" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:27:54.524031" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:27:54.523072" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:27:54.524197" elapsed="0.000412"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.524906" level="INFO">index=56
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:27:54.524792" 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-04-25T23:27:54.525168" elapsed="0.002133"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.527729" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:27:54.530202" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.527454" elapsed="0.003118">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:27:54.539981" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:27:54.540360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:27:54.538650" elapsed="0.001800"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.541283" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.541557" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:27:54.531361" elapsed="0.010355"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:27:54.530867" elapsed="0.010899"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.514269" elapsed="0.027582">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.542200" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:27:54.542274" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.499338" elapsed="0.043040">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:27:54.542484" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:27:54.542526" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.494948" elapsed="0.047601"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:27:54.542928" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:27:54.542682" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-25T23:27:54.542646" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:27:54.494818" elapsed="0.048210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:27:54.494624" elapsed="0.048437"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:27:54.492311" elapsed="0.050805"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:27:54.487877" elapsed="0.055295"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:27:54.487452" elapsed="0.055764"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:27:54.484314" elapsed="0.058954"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:27:54.544575" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-delete-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-delete-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:27:54.544882" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:27:54.544353" elapsed="0.000557"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:27:54.544956" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:27:54.545105" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:27:54.544050" elapsed="0.001082"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.548294" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:27:54.545874" elapsed="0.002479"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.549343" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:27:54.548495" elapsed="0.000901"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:27:54.552867" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:27:54.549538" elapsed="0.003391"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:27:54.545562" elapsed="0.007423"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.553666" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.553121" elapsed="60.001223">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.554455" elapsed="0.000034"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.545273" elapsed="60.009347">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.554702" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.543754" elapsed="60.011051">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.555045" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.555256" elapsed="0.000021"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.555419" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.555579" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.555643" elapsed="0.000031"/>
</return>
<arg>commit-delete</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.543436" elapsed="60.012328">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:28:54.557227" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:28:54.556828" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.556808" elapsed="0.000506"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:28:54.557455" elapsed="0.000445"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.562939" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:28:54.562489" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:28:54.563190" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.563044" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.563024" elapsed="0.000229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.563703" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:28:54.563387" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:28:54.564151" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Delete</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.563875" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:28:54.564505" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:28:54.564326" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.565047" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:28:54.564695" elapsed="0.000380"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.565529" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:28:54.565218" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.566183" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:28:54.565716" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.566697" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:28:54.566382" elapsed="0.000364"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:28:54.562195" elapsed="0.004607"/>
</kw>
<status status="PASS" start="2026-04-25T23:28:54.556588" elapsed="0.010265"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:28:54.556180" elapsed="0.010716"/>
</kw>
<doc>Commit the deletion of the element and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:27:54.483749" elapsed="60.083187">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t17" name="Get_Config_Running_To_Confirm_Delete_After_Commit" line="135">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:28:54.570169" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:28:54.569921" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.571401" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.571291" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.571272" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.575967" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.575860" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.575841" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.577007" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:28:54.576609" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.577476" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:28:54.577182" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:28:54.577547" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:28:54.577721" 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-04-25T23:28:54.576248" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.582986" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.582878" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.582859" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.584269" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.584163" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.584144" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:28:54.584851" level="INFO">${karaf_connection_index} = 56</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.584469" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.585270" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:28:54.585023" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.586119" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.585844" elapsed="0.001176">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:28:54.587206" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:28:54.587252" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.585442" elapsed="0.001833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.588097" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.587824" elapsed="0.001293">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:28:54.589292" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:28:54.589339" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.587430" elapsed="0.001933"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.590280" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.589664" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:28:54.589439" elapsed="0.001017">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:28:54.589419" elapsed="0.001072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.590643" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.590885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:28:54.590754" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:28:54.590737" elapsed="0.000246"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.591015" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:28:54.593907" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:28:54.594129" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:28:54.593228" 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-04-25T23:28:54.595030" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.595873" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:28:54.591849" elapsed="0.004139"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:28:54.591264" elapsed="0.004840"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.583856" elapsed="0.012333">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</status>
</kw>
<msg time="2026-04-25T23:28:54.596293" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:28:54.596337" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_Config_Running_To_Confirm_Delete_After_Commit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.583193" elapsed="0.013168"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.596547" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.596439" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.596420" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.597711" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:28:54.597584" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.597563" elapsed="0.000228"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.598060" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:28:54.598166" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:28:54.597931" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.598594" level="INFO">{1: 56}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:28:54.598333" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:28:54.599042" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:28:54.598797" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.599580" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:28:54.600015" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:28:54.600062" level="INFO">${old_connection_index} = 56</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.599232" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:28:54.600999" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.602970" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.602534" elapsed="0.000972">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.601386" elapsed="0.002197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:28:54.605046" elapsed="0.000359"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.603825" elapsed="0.001643"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:28:54.600377" elapsed="0.005192"/>
</kw>
<status status="PASS" start="2026-04-25T23:28:54.600168" elapsed="0.005453"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.600149" elapsed="0.005512"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:28:54.606600" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.606194" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:28:54.606692" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:28:54.606883" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:28:54.605881" elapsed="0.001028"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.607054" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.607753" level="INFO">index=57
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:28:54.607627" elapsed="0.000254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:28:54.608018" elapsed="0.002071"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.610506" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:28:54.613047" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.610242" elapsed="0.003177">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:28:54.626386" elapsed="0.000347"/>
</kw>
<msg time="2026-04-25T23:28:54.626791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:28:54.624524" elapsed="0.002356"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.627191" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.627437" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:28:54.614331" elapsed="0.013244"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:28:54.613702" elapsed="0.013923"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.597119" elapsed="0.030835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.628279" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:28:54.628351" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.582521" elapsed="0.045934">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:28:54.628560" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:28:54.628603" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.578121" elapsed="0.050505"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:28:54.628960" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:28:54.628719" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-25T23:28:54.628700" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:28:54.577992" elapsed="0.051066"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:28:54.577815" elapsed="0.051275"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:28:54.575485" elapsed="0.053660"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:28:54.571000" elapsed="0.058200"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:28:54.570568" elapsed="0.058677"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:28:54.567895" elapsed="0.061402"/>
</kw>
<kw name="Check_Test_Objects_Not_Present_In_Config">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:28:54.630583" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-delete-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-delete-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:28:54.630825" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:28:54.630365" elapsed="0.000489"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:28:54.630900" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:28:54.631049" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:28:54.630063" elapsed="0.001014"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.635641" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:28:54.631858" elapsed="0.003885"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.636682" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:28:54.635887" elapsed="0.000850"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:28:54.644472" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:28:54.636879" elapsed="0.007662"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:28:54.631514" elapsed="0.013084"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.645289" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.644754" elapsed="60.001223">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.646085" elapsed="0.000037"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.631223" elapsed="60.015031">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.646318" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.629756" elapsed="60.016661">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:29:54.646655" elapsed="0.000040"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;REPLACE&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.646882" elapsed="0.000023"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.646949" elapsed="0.000015"/>
</return>
<arg>get-config-delete-after-commit</arg>
<doc>Use dataset with the specified name to get the configuration and check that none of our test objects are there.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.629453" elapsed="60.017607">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:29:54.648476" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:29:54.648041" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.648020" elapsed="0.000544"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:29:54.648721" elapsed="0.000688"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.654218" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:29:54.653777" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:29:54.654472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.654323" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.654303" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.654986" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:29:54.654684" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:29:54.655506" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_Config_Running_To_Confirm_Delete_After_Commit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:29:54.655229" elapsed="0.000305"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:29:54.655879" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:29:54.655701" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.656419" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit"
reference somewhere ...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:29:54.656055" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.656918" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:29:54.656591" elapsed="0.000355"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.657538" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:29:54.657090" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.658053" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:29:54.657752" elapsed="0.000349"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:29:54.653426" elapsed="0.004732"/>
</kw>
<status status="PASS" start="2026-04-25T23:29:54.647817" elapsed="0.010392"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:29:54.647385" elapsed="0.010867"/>
</kw>
<doc>Check that the element is gone.</doc>
<status status="FAIL" start="2026-04-25T23:28:54.567351" elapsed="60.090941">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t18" name="Commit_No_Transaction" line="139">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:29:54.661495" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:29:54.661244" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.662740" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.662613" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.662594" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.667263" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.667157" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.667139" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.668299" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:29:54.667918" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.668813" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:29:54.668499" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:29:54.668885" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:29:54.669040" 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-04-25T23:29:54.667540" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.674355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.674247" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.674227" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.675628" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.675523" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.675505" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:29:54.676211" level="INFO">${karaf_connection_index} = 57</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:29:54.675849" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.676716" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:29:54.676385" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.677551" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.677281" elapsed="0.001178">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:29:54.678693" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:29:54.678742" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.676891" elapsed="0.001875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.679577" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.679301" elapsed="0.001381">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:29:54.680863" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:29:54.680910" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.678923" elapsed="0.002010"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.681849" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.681214" elapsed="0.000714">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:29:54.681008" elapsed="0.001013">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:29:54.680989" elapsed="0.001066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.682201" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.682416" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:29:54.682287" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:29:54.682270" elapsed="0.000240"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.682542" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:29:54.685378" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:29:54.685598" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:29:54.684788" elapsed="0.001044"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.686620" elapsed="0.000051"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.687440" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:29:54.683374" elapsed="0.004177"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:29:54.682812" elapsed="0.004869"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.675219" elapsed="0.012549">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</status>
</kw>
<msg time="2026-04-25T23:29:54.687875" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:29:54.687919" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_No_Transaction"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.674562" elapsed="0.013411"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.688162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.688053" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.688034" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.689226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:29:54.689120" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.689102" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.689565" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:29:54.689777" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:29:54.689434" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.690207" level="INFO">{1: 57}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:29:54.689948" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:29:54.690630" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:29:54.690388" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:29:54.691183" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:29:54.691600" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:29:54.691646" level="INFO">${old_connection_index} = 57</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.690837" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:29:54.692463" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.694568" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.694154" elapsed="0.000957">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.692904" elapsed="0.002282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:29:54.696507" elapsed="0.000414"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.695406" elapsed="0.001578"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:29:54.691970" elapsed="0.005115"/>
</kw>
<status status="PASS" start="2026-04-25T23:29:54.691762" elapsed="0.005373"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.691743" elapsed="0.005418"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:29:54.698086" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:29:54.697685" elapsed="0.000428"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:29:54.698160" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:29:54.698316" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:29:54.697352" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:29:54.698479" elapsed="0.000432"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.699177" level="INFO">index=58
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:29:54.699070" 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-04-25T23:29:54.699435" elapsed="0.002081"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.702089" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:29:54.704124" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.701828" elapsed="0.002669">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:29:54.714118" elapsed="0.000312"/>
</kw>
<msg time="2026-04-25T23:29:54.714493" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:29:54.712690" elapsed="0.001891"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.714914" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.715160" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:29:54.705333" elapsed="0.009966"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:29:54.704831" elapsed="0.010517"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.688824" elapsed="0.026606">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.715763" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:29:54.715837" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.673909" elapsed="0.042030">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:29:54.716043" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:29:54.716086" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.669468" elapsed="0.046641"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:29:54.716423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:29:54.716185" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-25T23:29:54.716167" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:29:54.669332" elapsed="0.047190"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:29:54.669153" elapsed="0.047399"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:29:54.666798" elapsed="0.049807"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:29:54.662328" elapsed="0.054358"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:29:54.661917" elapsed="0.054817"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:29:54.659218" elapsed="0.057597"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:29:54.718246" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:29:54.718405" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:29:54.718023" elapsed="0.000409"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:29:54.718477" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:29:54.718623" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:29:54.717542" elapsed="0.001111"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.722127" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:29:54.719404" elapsed="0.002781"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.723044" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:29:54.722325" elapsed="0.000771"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:29:54.726542" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:29:54.723262" elapsed="0.003375"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:29:54.719104" elapsed="0.007605"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.727505" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.726847" elapsed="60.001397">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.728352" elapsed="0.000043"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.718814" elapsed="60.009715">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.728598" elapsed="0.000020"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.717257" elapsed="60.011468">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.728982" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.729214" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.729382" elapsed="0.000023"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.729556" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.729622" elapsed="0.000016"/>
</return>
<arg>commit-no-transaction</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:29:54.716982" elapsed="60.012769">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.731166" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:30:54.730617" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:30:54.731435" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.731278" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.731256" elapsed="0.000262"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:30:54.731710" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.734763" level="FAIL">'4455' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.734200" elapsed="0.000626">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-25T23:30:54.735011" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:30:54.732076" elapsed="0.002963"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.735605" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:30:54.735201" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.736106" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:30:54.735810" elapsed="0.000323"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.736585" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:30:54.736276" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.737147" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:30:54.736772" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.737588" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:30:54.737336" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.738310" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4455'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-25T23:30:54.737956" elapsed="0.000412"/>
</kw>
<status status="PASS" start="2026-04-25T23:30:54.737731" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.737712" elapsed="0.000715"/>
</if>
<arg>4455</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:30:54.730220" elapsed="0.008253"/>
</kw>
<doc>Attempt to perform "commit" when there are no changes in the candidate configuration and check that it returns OK status.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4455</tag>
<status status="FAIL" start="2026-04-25T23:29:54.658636" elapsed="60.079969">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t19" name="Edit_Config_Second_Batch_Merge" line="144">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:30:54.741907" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:30:54.741635" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.743155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.743045" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.743027" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.747673" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.747538" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.747520" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.748723" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:30:54.748321" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.749193" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:30:54.748899" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:30:54.749264" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:30:54.749420" 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-04-25T23:30:54.747958" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.754785" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.754674" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.754640" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.756093" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.755988" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.755970" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:30:54.756677" level="INFO">${karaf_connection_index} = 58</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:30:54.756291" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.757103" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:30:54.756851" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.757938" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.757645" elapsed="0.001205">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:30:54.759029" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:30:54.759074" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.757274" elapsed="0.001824"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.759953" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.759632" elapsed="0.001353">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:30:54.761163" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:30:54.761209" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.759254" elapsed="0.001978"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.762142" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.761516" elapsed="0.000705">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:30:54.761308" elapsed="0.001009">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:30:54.761288" elapsed="0.001098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.762541" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.762777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:30:54.762628" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:30:54.762611" elapsed="0.000271"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.762915" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:30:54.765781" elapsed="0.000185"/>
</kw>
<msg time="2026-04-25T23:30:54.766044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:30:54.765107" elapsed="0.001053"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.767148" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.768018" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:30:54.763756" elapsed="0.004378"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:30:54.763160" elapsed="0.005089"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.755682" elapsed="0.012653">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</status>
</kw>
<msg time="2026-04-25T23:30:54.768438" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:30:54.768481" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Second_Batch_Merge"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.754994" elapsed="0.013510"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.768707" elapsed="0.000180"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.768581" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.768561" elapsed="0.000381"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.769742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:30:54.769615" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.769597" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.770075" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:30:54.770177" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:30:54.769945" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.770599" level="INFO">{1: 58}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:30:54.770342" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:30:54.771149" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:30:54.770907" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:30:54.771694" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:30:54.772128" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:30:54.772174" level="INFO">${old_connection_index} = 58</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.771337" elapsed="0.000859"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:30:54.772998" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.774999" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.774524" elapsed="0.001008">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.773384" elapsed="0.002224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:30:54.776997" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.775874" elapsed="0.001545"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:30:54.772482" elapsed="0.005073"/>
</kw>
<status status="PASS" start="2026-04-25T23:30:54.772272" elapsed="0.005336"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.772254" elapsed="0.005379"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:30:54.778599" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:30:54.778159" elapsed="0.000468"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:30:54.778714" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:30:54.778869" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:30:54.777845" elapsed="0.001049"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:30:54.779037" elapsed="0.000408"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.779762" level="INFO">index=59
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:30:54.779602" elapsed="0.000335"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:30:54.780096" elapsed="0.002305"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.782930" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:30:54.785106" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.782554" elapsed="0.002924">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:30:54.795155" elapsed="0.000342"/>
</kw>
<msg time="2026-04-25T23:30:54.795569" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:30:54.793551" elapsed="0.002126"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.796000" elapsed="0.000051"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.796285" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:30:54.786269" elapsed="0.010160"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:30:54.785760" elapsed="0.010718"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.769325" elapsed="0.027237">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.796907" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:30:54.796982" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.754322" elapsed="0.042765">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:30:54.797194" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:30:54.797237" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.749824" elapsed="0.047437"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:30:54.797581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:30:54.797339" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-25T23:30:54.797320" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:30:54.749691" elapsed="0.048009"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:30:54.749499" elapsed="0.048233"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:30:54.747179" elapsed="0.050611"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:30:54.742758" elapsed="0.055130"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:30:54.742320" elapsed="0.055615"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:30:54.739601" elapsed="0.058387"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:30:54.799443" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-2-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-2-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:30:54.799613" level="INFO">${data} = &lt;rpc message-id="20" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:30:54.799222" elapsed="0.000421"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:30:54.799706" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:30:54.799858" level="INFO">${request} = &lt;rpc message-id="20" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:30:54.798912" elapsed="0.000974"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.803438" level="INFO">&lt;rpc message-id="20" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:30:54.800652" elapsed="0.002843"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.804625" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:30:54.803679" elapsed="0.001028"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:30:54.857933" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;OLD001&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;model&gt;Skoda MB&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Skoda Mlada Boleslav&lt;/manufacturer&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;category&gt;sedan&lt;/category&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUST002&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;gender&gt;male&lt;/gender&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;28&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `28'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;OLD001&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUST002&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:30:54.804849" elapsed="0.053333"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:30:54.800350" elapsed="0.057965"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.859407" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.858707" elapsed="60.001396">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.860216" elapsed="0.000045"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.800032" elapsed="60.060375">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.860475" elapsed="0.000016"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.798444" elapsed="60.062138">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.860872" elapsed="0.000029"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.861100" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.861267" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.861429" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.861494" elapsed="0.000017"/>
</return>
<arg>merge-2</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.798163" elapsed="60.063436">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:31:54.863401" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:31:54.862998" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.862977" elapsed="0.000511"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:31:54.863628" elapsed="0.000392"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.868758" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:31:54.868307" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:31:54.869008" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.868864" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.868844" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.869508" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:31:54.869207" elapsed="0.000327"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:31:54.869972" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Second_Batch_Merge</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:31:54.869694" elapsed="0.000305"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:31:54.870318" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:31:54.870145" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.870858" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:31:54.870485" elapsed="0.000401"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.871339" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:31:54.871029" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.871970" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:31:54.871508" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.872552" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:31:54.872253" elapsed="0.000346"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:31:54.868007" elapsed="0.004663"/>
</kw>
<status status="PASS" start="2026-04-25T23:31:54.862746" elapsed="0.009977"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:31:54.861947" elapsed="0.010821"/>
</kw>
<doc>Create an element to be discarded and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:30:54.739042" elapsed="60.133767">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t20" name="Get_And_Check_Config_Candidate_For_Discard" line="148">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:31:54.876051" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:31:54.875800" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.877305" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.877193" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.877174" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.881976" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.881867" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.881848" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.883051" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:31:54.882622" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.883520" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:31:54.883225" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:31:54.883590" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:31:54.883761" 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-04-25T23:31:54.882258" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.888855" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.888747" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.888728" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.890122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.890015" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.889997" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:31:54.890729" 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-04-25T23:31:54.890322" elapsed="0.000434"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.891190" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:31:54.890934" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.892030" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.891754" elapsed="0.001180">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:31:54.893124" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:31:54.893170" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.891362" elapsed="0.001832"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.894075" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.893798" elapsed="0.001399">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:31:54.895375" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:31:54.895421" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.893393" elapsed="0.002052"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.896353" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.895747" elapsed="0.000685">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:31:54.895521" elapsed="0.001004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:31:54.895502" elapsed="0.001225">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.896881" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.897100" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:31:54.896969" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:31:54.896951" elapsed="0.000246"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.897230" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:31:54.900162" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:31:54.900385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:31:54.899435" elapsed="0.001045"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.901285" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.902120" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:31:54.898072" 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-04-25T23:31:54.897483" elapsed="0.004864"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.889714" elapsed="0.012718">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</status>
</kw>
<msg time="2026-04-25T23:31:54.902533" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:31:54.902577" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_For_Discard"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.889060" elapsed="0.013542"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.902908" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.902780" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.902760" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.903766" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:31:54.903642" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.903624" elapsed="0.000207"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.904089" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:31:54.904189" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:31:54.903972" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.904605" level="INFO">{1: 59}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:31:54.904352" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:31:54.905043" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:31:54.904802" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:31:54.905577" elapsed="0.000328"/>
</kw>
<msg time="2026-04-25T23:31:54.906039" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:31:54.906086" 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-04-25T23:31:54.905229" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:31:54.907032" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.909012" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.908581" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.907417" elapsed="0.002217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:31:54.911143" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.909879" elapsed="0.001687"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:31:54.906393" elapsed="0.005290"/>
</kw>
<status status="PASS" start="2026-04-25T23:31:54.906186" elapsed="0.005551"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.906167" elapsed="0.005595"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:31:54.912681" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:31:54.912262" elapsed="0.000447"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:31:54.912757" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:31:54.912907" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:31:54.911956" elapsed="0.000976"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:31:54.913077" elapsed="0.000410"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.913767" level="INFO">index=60
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:31:54.913642" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:31:54.914031" elapsed="0.002298"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.916753" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:31:54.918875" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.916479" elapsed="0.002766">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:31:54.931051" elapsed="0.000468"/>
</kw>
<msg time="2026-04-25T23:31:54.931603" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:31:54.929007" elapsed="0.002751"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.932132" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.932381" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:31:54.920021" elapsed="0.012499"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:31:54.919504" elapsed="0.013065"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.903353" elapsed="0.029297">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.932985" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:31:54.933059" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.888397" elapsed="0.044799">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:31:54.933303" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:31:54.933348" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.884149" elapsed="0.049223"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:31:54.933705" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:31:54.933449" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-25T23:31:54.933431" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:31:54.884019" elapsed="0.049789"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:31:54.883843" elapsed="0.049996"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:31:54.881488" elapsed="0.052406"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:31:54.876890" elapsed="0.057061"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:31:54.876456" elapsed="0.057541"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:31:54.873746" elapsed="0.060304"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:31:54.935233" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-candidate-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-candidate-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:31:54.935382" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="21"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;candidate/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:31:54.935009" elapsed="0.000402"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:31:54.935457" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:31:54.935607" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="21"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;candidate/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:31:54.934473" elapsed="0.001162"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.939545" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="21"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:31:54.936386" elapsed="0.003218"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.940535" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:31:54.939814" elapsed="0.000773"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:31:54.949584" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:31:54.940742" elapsed="0.008925"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:31:54.936092" elapsed="0.013635"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.950382" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.949866" elapsed="60.001158">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.951131" elapsed="0.000037"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.935794" elapsed="60.015508">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.951367" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>get-config-candidate</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.934200" elapsed="60.017267">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_First_Batch_Data_Not_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:32:54.951816" elapsed="0.000029"/>
</kw>
<kw name="Check_Second_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:32:54.951960" elapsed="0.000022"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:32:54.953696" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:32:54.953280" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.953255" elapsed="0.000530"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:32:54.953931" elapsed="0.000396"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.959078" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:32:54.958628" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:32:54.959328" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.959184" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.959164" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.959839" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:32:54.959524" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:32:54.960275" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_And_Check_Config_Candidate_For_Discard</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:32:54.960011" elapsed="0.000291"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:32:54.960622" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:32:54.960447" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.961157" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:32:54.960812" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.961644" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:32:54.961332" elapsed="0.000355"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.962284" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:32:54.961829" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.962788" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:32:54.962477" elapsed="0.000359"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:32:54.958332" elapsed="0.004560"/>
</kw>
<status status="PASS" start="2026-04-25T23:32:54.952747" elapsed="0.010195"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:32:54.952315" elapsed="0.010669"/>
</kw>
<doc>Check that the element to be discarded is present in the candidate configuration.</doc>
<status status="FAIL" start="2026-04-25T23:31:54.873184" elapsed="60.089840">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t21" name="Discard_Changes_Using_Discard_Request" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:32:54.966980" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:32:54.966722" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.968202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.968093" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.968074" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.972701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.972581" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.972563" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.973727" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:32:54.973335" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.974222" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:32:54.973899" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:32:54.974293" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:32:54.974448" 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-04-25T23:32:54.972977" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.979688" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.979558" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.979539" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.980960" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.980853" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.980835" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:32:54.981522" 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-04-25T23:32:54.981159" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.981968" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:32:54.981713" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.982837" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.982547" elapsed="0.001225">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:32:54.983955" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:32:54.984000" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.982169" elapsed="0.001855"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.984859" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.984568" elapsed="0.001314">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:32:54.986055" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:32:54.986100" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.984185" elapsed="0.001954"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.987037" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.986423" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:32:54.986215" elapsed="0.000993">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:32:54.986196" elapsed="0.001047">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:54.987390" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:54.987601" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:32:54.987474" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:32:54.987457" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.987775" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:32:54.990685" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:32:54.990910" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:32:54.989963" elapsed="0.001041"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:54.991955" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:54.992791" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:32:54.988602" elapsed="0.004302"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:32:54.988029" elapsed="0.004991"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.980527" elapsed="0.012578">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</status>
</kw>
<msg time="2026-04-25T23:32:54.993208" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:32:54.993252" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Discard_Changes_Using_Discard_Request"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.979894" elapsed="0.013382"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.993459" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.993352" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.993333" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:32:54.994594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:32:54.994488" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.994471" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.994945" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:32:54.995048" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:32:54.994817" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.995468" level="INFO">{1: 60}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:32:54.995213" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:32:54.995907" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:32:54.995664" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:32:54.996435" elapsed="0.000329"/>
</kw>
<msg time="2026-04-25T23:32:54.996862" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:32:54.996907" 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-04-25T23:32:54.996096" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:32:54.997812" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:32:54.999790" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.999360" elapsed="0.000962">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.998229" elapsed="0.002168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:32:55.001855" elapsed="0.000369"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:55.000619" elapsed="0.001668"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:32:54.997210" elapsed="0.005176"/>
</kw>
<status status="PASS" start="2026-04-25T23:32:54.997004" elapsed="0.005433"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:54.996986" elapsed="0.005476"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:32:55.003420" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:32:55.003017" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:32:55.003495" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:32:55.003646" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:32:55.002669" elapsed="0.001017"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:32:55.003829" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:32:55.004500" level="INFO">index=61
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:32:55.004393" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:32:55.004780" elapsed="0.002102"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:32:55.007300" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:32:55.009262" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:32:55.007033" elapsed="0.002601">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:32:55.020789" elapsed="0.000651"/>
</kw>
<msg time="2026-04-25T23:32:55.021530" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:32:55.018971" elapsed="0.002999"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:55.022629" elapsed="0.000053"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:55.023018" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:32:55.010566" elapsed="0.012658"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:32:55.010053" elapsed="0.013237"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.994193" elapsed="0.029182">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:55.023710" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:32:55.023782" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.979219" elapsed="0.044666">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:32:55.023988" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:32:55.024029" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.974847" elapsed="0.049205"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:32:55.024364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:32:55.024127" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-25T23:32:55.024109" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:32:54.974718" elapsed="0.049744"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:32:54.974527" elapsed="0.049965"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:32:54.972226" elapsed="0.052320"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:32:54.967808" elapsed="0.056790"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:32:54.967381" elapsed="0.057261"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:32:54.964195" elapsed="0.060556"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:32:55.026292" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-discard-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-discard-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:32:55.026502" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="22"&gt;
    &lt;discard-changes/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:32:55.026015" elapsed="0.000527"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:32:55.026596" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:32:55.026835" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="22"&gt;
    &lt;discard-changes/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:32:55.025584" elapsed="0.001280"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:32:55.030401" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="22"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:32:55.027624" elapsed="0.002835"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:32:55.031722" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:32:55.030600" elapsed="0.001188"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:32:55.035289" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;discard-changes/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:32:55.031931" elapsed="0.003422"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:32:55.027327" elapsed="0.008082"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.036135" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:32:55.035545" elapsed="60.001338">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.036998" elapsed="0.000041"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:32:55.027034" elapsed="60.010151">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.037253" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:32:55.025238" elapsed="60.012120">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.037634" elapsed="0.000044"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.037871" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.038045" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.038207" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.038276" elapsed="0.000015"/>
</return>
<arg>commit-discard</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:32:55.024922" elapsed="60.013456">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:33:55.041686" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:33:55.039402" elapsed="0.002349"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.039381" elapsed="0.002396"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:33:55.041922" elapsed="0.000389"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.047102" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:33:55.046622" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:33:55.047430" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.047285" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.047265" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.047939" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:33:55.047624" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:33:55.048380" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Discard_Changes_Using_Discard_Request</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:33:55.048108" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:33:55.048742" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:33:55.048551" elapsed="0.000217"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.049250" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:33:55.048907" elapsed="0.000369"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.049736" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:33:55.049416" elapsed="0.000348"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.050346" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:33:55.049905" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.050850" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:33:55.050539" elapsed="0.000358"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:33:55.046328" elapsed="0.004647"/>
</kw>
<status status="PASS" start="2026-04-25T23:33:55.039179" elapsed="0.011856"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:33:55.038721" elapsed="0.012362"/>
</kw>
<doc>Ask the server to discard the candidate and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:32:54.963547" elapsed="60.087584">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t22" name="Get_And_Check_Config_Candidate_To_Confirm_Discard" line="158">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:33:55.054266" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:33:55.054019" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.055576" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.055465" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.055446" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.060139" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.060016" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.059998" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.061174" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:33:55.060794" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.061642" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:33:55.061348" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:33:55.061793" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:33:55.061954" 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-04-25T23:33:55.060419" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.067316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.067202" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.067178" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.068579" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.068474" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.068456" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:33:55.069166" 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-04-25T23:33:55.068803" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.069596" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:33:55.069338" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.070602" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.070334" elapsed="0.001355">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:33:55.071930" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:33:55.071983" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.069960" elapsed="0.002049"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.072875" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.072581" elapsed="0.001315">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:33:55.074074" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:33:55.074119" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.072193" elapsed="0.001949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.075072" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.074424" elapsed="0.000729">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:33:55.074217" elapsed="0.001031">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:33:55.074198" elapsed="0.001084">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.075429" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.075645" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:33:55.075516" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:33:55.075497" elapsed="0.000273"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.075802" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:33:55.078697" elapsed="0.000182"/>
</kw>
<msg time="2026-04-25T23:33:55.079000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:33:55.077980" elapsed="0.001130"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.080175" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.081103" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:33:55.076624" elapsed="0.004598"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:33:55.076057" elapsed="0.005323"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.068174" elapsed="0.013369">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</status>
</kw>
<msg time="2026-04-25T23:33:55.081674" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:33:55.081720" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Get_And_Check_Config_Candidate_To_Confirm_Discard"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.067522" elapsed="0.014222"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.081929" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.081821" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.081801" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.083092" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:33:55.082977" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.082954" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.083433" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:33:55.083538" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:33:55.083299" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.083979" level="INFO">{1: 61}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:33:55.083721" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:33:55.084402" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:33:55.084162" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:33:55.084959" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:33:55.085372" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:33:55.085417" 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-04-25T23:33:55.084593" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:33:55.086236" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.088392" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.087961" elapsed="0.000988">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.086617" elapsed="0.002407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:33:55.090369" elapsed="0.000412"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.089246" elapsed="0.001598"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:33:55.085744" elapsed="0.005239"/>
</kw>
<status status="PASS" start="2026-04-25T23:33:55.085519" elapsed="0.005527"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.085498" elapsed="0.005578"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:33:55.092035" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:33:55.091620" elapsed="0.000441"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:33:55.092107" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:33:55.092258" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:33:55.091303" elapsed="0.000979"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:33:55.092423" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.093123" level="INFO">index=62
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:33:55.093016" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:33:55.093448" elapsed="0.002144"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.096023" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:33:55.097942" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.095761" elapsed="0.002553">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:33:55.108277" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:33:55.108678" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:33:55.107051" elapsed="0.001718"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.109099" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.109350" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:33:55.099332" elapsed="0.010158"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:33:55.098573" elapsed="0.010966"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.082370" elapsed="0.027251">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.110240" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:33:55.110314" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.066810" elapsed="0.043611">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:33:55.110534" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:33:55.110577" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.062345" elapsed="0.048255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:33:55.110954" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:33:55.110698" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-25T23:33:55.110678" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:33:55.062213" elapsed="0.048863"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:33:55.062034" elapsed="0.049081"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:33:55.059643" elapsed="0.051540"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:33:55.055173" elapsed="0.056079"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:33:55.054691" elapsed="0.056610"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:33:55.052042" elapsed="0.059312"/>
</kw>
<kw name="Check_Test_Objects_Not_Present_In_Config">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:33:55.112645" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-candidate-discard-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/get-config-candidate-discard-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:33:55.112841" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;candidate/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:33:55.112420" elapsed="0.000450"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:33:55.112914" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:33:55.113061" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;candidate/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:33:55.112114" elapsed="0.000976"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.116840" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="empty"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:33:55.113995" elapsed="0.002902"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.117872" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:33:55.117057" elapsed="0.000890"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:33:55.128039" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:33:55.118127" elapsed="0.009996"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:33:55.113560" elapsed="0.014630"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.128915" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.128343" elapsed="60.001212">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.129675" elapsed="0.000039"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.113268" elapsed="60.016580">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.129916" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.111823" elapsed="60.018196">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:34:55.130265" elapsed="0.000027"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;REPLACE&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.130464" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.130529" elapsed="0.000017"/>
</return>
<arg>get-config-candidate-discard</arg>
<doc>Use dataset with the specified name to get the configuration and check that none of our test objects are there.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.111525" elapsed="60.019142">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:34:55.132054" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:34:55.131639" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.131617" elapsed="0.000525"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:34:55.132280" elapsed="0.000404"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.137726" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:34:55.137276" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:34:55.137984" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.137839" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.137819" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.138484" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:34:55.138182" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:34:55.138969" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Get_And_Check_Config_Candidate_To_Confirm_Discard</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:34:55.138691" elapsed="0.000305"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:34:55.139320" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:34:55.139144" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.139863" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard"
reference somewhere ...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:34:55.139497" elapsed="0.000469"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.140430" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:34:55.140115" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.141072" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:34:55.140601" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.141572" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:34:55.141273" elapsed="0.000349"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:34:55.136980" elapsed="0.004715"/>
</kw>
<status status="PASS" start="2026-04-25T23:34:55.131417" elapsed="0.010329"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:34:55.130988" elapsed="0.010800"/>
</kw>
<doc>Check that the element was really discarded.</doc>
<status status="FAIL" start="2026-04-25T23:33:55.051511" elapsed="60.090318">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t23" name="Edit_Config_Multiple_Batch_Merge_Create" line="162">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:34:55.144979" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:34:55.144728" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.146206" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.146096" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.146078" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.150766" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.150644" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.150626" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.151819" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:34:55.151414" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.152293" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:34:55.151996" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:34:55.152363" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:34:55.152519" 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-04-25T23:34:55.151049" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.157803" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.157691" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.157672" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.159105" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.158999" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.158981" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:34:55.159726" 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-04-25T23:34:55.159344" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.160166" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:34:55.159915" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.161017" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.160734" elapsed="0.001192">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:34:55.162107" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:34:55.162152" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.160342" elapsed="0.001833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.163025" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.162748" elapsed="0.001299">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:34:55.164225" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:34:55.164271" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.162331" elapsed="0.001963"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.165197" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.164576" elapsed="0.000700">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:34:55.164369" elapsed="0.001001">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:34:55.164349" elapsed="0.001056">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.165554" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.165787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:34:55.165640" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:34:55.165623" elapsed="0.000261"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.165917" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:34:55.168759" elapsed="0.000156"/>
</kw>
<msg time="2026-04-25T23:34:55.168988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:34:55.168108" elapsed="0.000976"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.169987" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.170829" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:34:55.166769" 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-04-25T23:34:55.166172" elapsed="0.004886"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.158690" elapsed="0.012452">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</status>
</kw>
<msg time="2026-04-25T23:34:55.171244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:34:55.171288" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Create"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.158011" elapsed="0.013301"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.171497" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.171389" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.171370" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.172560" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:34:55.172419" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.172399" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.172911" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:34:55.173015" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:34:55.172785" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.173440" level="INFO">{1: 62}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:34:55.173183" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:34:55.173990" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:34:55.173623" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:34:55.174526" elapsed="0.000350"/>
</kw>
<msg time="2026-04-25T23:34:55.174977" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:34:55.175023" 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-04-25T23:34:55.174180" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:34:55.175859" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.177873" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.177390" elapsed="0.001014">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.176247" elapsed="0.002233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:34:55.179858" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.178749" elapsed="0.001530"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:34:55.175336" elapsed="0.005044"/>
</kw>
<status status="PASS" start="2026-04-25T23:34:55.175125" elapsed="0.005305"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.175106" elapsed="0.005350"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:34:55.181503" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:34:55.181101" elapsed="0.000428"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:34:55.181577" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:34:55.181825" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:34:55.180661" elapsed="0.001189"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:34:55.181992" elapsed="0.000406"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.182687" level="INFO">index=63
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:34:55.182552" elapsed="0.000262"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:34:55.182947" elapsed="0.002063"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.185413" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:34:55.187307" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.185159" elapsed="0.002545">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:34:55.197127" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:34:55.197506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:34:55.195904" elapsed="0.001691"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.198044" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.198299" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:34:55.188493" elapsed="0.009963"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:34:55.187977" elapsed="0.010529"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.171956" elapsed="0.026633">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.198955" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:34:55.199031" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.157338" elapsed="0.041799">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:34:55.199244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:34:55.199289" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.152925" elapsed="0.046389"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:34:55.199631" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:34:55.199390" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-25T23:34:55.199372" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:34:55.152793" elapsed="0.046976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:34:55.152602" elapsed="0.047198"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:34:55.150271" elapsed="0.049585"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:34:55.145809" elapsed="0.054104"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:34:55.145379" elapsed="0.054580"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:34:55.142592" elapsed="0.057421"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:34:55.201298" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-create-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-create-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:34:55.201467" level="INFO">${data} = &lt;rpc message-id="115" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;create&lt;/default-operation&gt;
&lt;config&gt;
&lt;people xmlns="urn:opendayli...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:34:55.201077" elapsed="0.000419"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:34:55.201541" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:34:55.201992" level="INFO">${request} = &lt;rpc message-id="115" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;create&lt;/default-operation&gt;
&lt;config&gt;
&lt;people xmlns="urn:opendayli...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:34:55.200771" elapsed="0.001251"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.205834" level="INFO">&lt;rpc message-id="115" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:34:55.202780" elapsed="0.003112"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.206876" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:34:55.206043" elapsed="0.000888"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:34:55.251564" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;create&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;99&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `99'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CAROLD&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Ford&lt;/manufacturer&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;year&gt;1950&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `1950'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:34:55.207093" elapsed="0.044833"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:34:55.202456" elapsed="0.049589"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.252985" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.252288" elapsed="60.001411">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.253807" elapsed="0.000044"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.202166" elapsed="60.051822">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.254056" elapsed="0.000018"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.200465" elapsed="60.053701">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.254425" elapsed="0.000029"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.254646" elapsed="0.000039"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.254835" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.255001" elapsed="0.000022"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.255070" elapsed="0.000017"/>
</return>
<arg>merge-multiple-create</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.200184" elapsed="60.054993">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:35:55.256689" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:35:55.256241" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.256219" elapsed="0.000562"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:35:55.256926" elapsed="0.000459"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.262616" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:35:55.262172" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:35:55.262887" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.262739" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.262719" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.263392" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:35:55.263088" elapsed="0.000331"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:35:55.263906" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Multiple_Batch_Merge_Create</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.263589" elapsed="0.000345"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:35:55.264268" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:35:55.264084" elapsed="0.000210"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.264820" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:35:55.264444" elapsed="0.000405"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.265309" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:35:55.264995" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.266058" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:35:55.265488" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.266564" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:35:55.266259" elapsed="0.000355"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:35:55.261867" elapsed="0.004823"/>
</kw>
<status status="PASS" start="2026-04-25T23:35:55.256006" elapsed="0.010738"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:35:55.255511" elapsed="0.011276"/>
</kw>
<doc>Use a create request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-25T23:34:55.142067" elapsed="60.124761">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t24" name="Edit_Config_Multiple_Batch_Merge_Third" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:35:55.271634" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:35:55.271333" elapsed="0.000607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.273064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.272948" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.272928" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.277630" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.277522" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.277503" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.278715" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:35:55.278308" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.279197" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:35:55.278894" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:35:55.279396" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:35:55.279577" 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-04-25T23:35:55.277940" elapsed="0.001662"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.284985" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.284876" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.284856" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.286269" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.286163" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.286145" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:35:55.286862" level="INFO">${karaf_connection_index} = 63</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.286467" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.287283" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:35:55.287034" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.288151" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.287878" elapsed="0.001192">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:35:55.289289" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:35:55.289335" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.287483" elapsed="0.001875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.290201" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.289926" elapsed="0.001314">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:35:55.291431" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:35:55.291477" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.289514" elapsed="0.001986"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.292417" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.291817" elapsed="0.000679">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:35:55.291577" elapsed="0.001013">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:35:55.291557" elapsed="0.001067">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.292786" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.293000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:35:55.292873" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:35:55.292856" elapsed="0.000238"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.293126" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:35:55.296163" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:35:55.296387" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:35:55.295322" elapsed="0.001159"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.297434" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.298295" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:35:55.293981" elapsed="0.004429"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:35:55.293382" elapsed="0.005143"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.285860" elapsed="0.012750">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</status>
</kw>
<msg time="2026-04-25T23:35:55.298740" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:35:55.298784" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Third"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.285195" elapsed="0.013624"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.299005" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.298897" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.298878" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.300180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:35:55.300059" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.300041" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.300519" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:35:55.300636" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:35:55.300387" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.301084" level="INFO">{1: 63}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:35:55.300824" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:35:55.301564" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:35:55.301318" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.302129" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:35:55.302549" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:35:55.302594" level="INFO">${old_connection_index} = 63</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.301782" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:35:55.303438" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.305537" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.305116" elapsed="0.000970">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.303992" elapsed="0.002171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:35:55.307524" elapsed="0.000379"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.306388" elapsed="0.001579"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:35:55.302932" elapsed="0.005137"/>
</kw>
<status status="PASS" start="2026-04-25T23:35:55.302721" elapsed="0.005398"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.302702" elapsed="0.005443"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:35:55.309070" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.308648" elapsed="0.000449"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:35:55.309145" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:35:55.309295" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:35:55.308339" elapsed="0.000980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.309465" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.310174" level="INFO">index=64
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:35:55.310065" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:35:55.310432" elapsed="0.002199"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.313060" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:35:55.315003" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.312798" elapsed="0.002594">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:35:55.325012" elapsed="0.000430"/>
</kw>
<msg time="2026-04-25T23:35:55.325508" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:35:55.323512" elapsed="0.002085"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.325928" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.326176" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:35:55.316260" elapsed="0.010056"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:35:55.315755" elapsed="0.010609"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.299760" elapsed="0.026686">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.326824" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:35:55.326897" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.284514" elapsed="0.042488">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:35:55.327121" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:35:55.327170" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.280032" elapsed="0.047162"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:35:55.327522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:35:55.327283" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-25T23:35:55.327265" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:35:55.279896" elapsed="0.047726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:35:55.279686" elapsed="0.048006"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:35:55.277155" elapsed="0.050598"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:35:55.272626" elapsed="0.055183"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:35:55.272089" elapsed="0.055763"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:35:55.268423" elapsed="0.059480"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:35:55.329334" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-1-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:35:55.329548" level="INFO">${data} = &lt;rpc message-id="50" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:35:55.329114" elapsed="0.000464"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:35:55.329624" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:35:55.329787" level="INFO">${request} = &lt;rpc message-id="50" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:35:55.328639" elapsed="0.001176"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.333311" level="INFO">&lt;rpc message-id="50" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:35:55.330559" elapsed="0.002828"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.334365" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:35:55.333557" elapsed="0.000872"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:35:55.389473" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CARYOUNG&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;model&gt;Toyota Prius&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Toyota&lt;/manufacturer&gt; [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;year&gt;2016&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `2016'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;category&gt;sedan&lt;/category&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTYOUNG&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;27&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `27'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CARYOUNG&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:35:55.334588" elapsed="0.055320"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:35:55.330264" elapsed="0.059754"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.390880" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.390272" elapsed="60.001245">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.391620" elapsed="0.000053"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.329957" elapsed="60.061848">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.391870" elapsed="0.000016"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.328353" elapsed="60.063616">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.392218" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.392422" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.392587" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.392765" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.392831" elapsed="0.000016"/>
</return>
<arg>merge-multiple-1</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.328074" elapsed="60.064860">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:36:55.396202" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:36:55.393922" elapsed="0.002346"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.393901" elapsed="0.002392"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:36:55.396439" elapsed="0.000390"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.401517" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:36:55.401081" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:36:55.401784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.401622" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.401603" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.402279" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:36:55.401980" elapsed="0.000326"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:36:55.402734" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Multiple_Batch_Merge_Third</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.402451" elapsed="0.000331"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:36:55.403108" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:36:55.402932" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.403618" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:36:55.403273" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.404113" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:36:55.403804" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.404822" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:36:55.404280" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.405316" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:36:55.405019" elapsed="0.000344"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:36:55.400787" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-25T23:36:55.393702" elapsed="0.011767"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:36:55.393258" elapsed="0.012252"/>
</kw>
<doc>Use a create request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-25T23:35:55.267601" elapsed="60.137950">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t25" name="Edit_Config_Multiple_Batch_Merge_Fourth" line="170">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:36:55.408817" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:36:55.408549" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.410045" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.409935" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.409917" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.414550" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.414444" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.414427" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.415593" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:36:55.415215" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.416078" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:36:55.415784" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:36:55.416147" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:36:55.416303" 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-04-25T23:36:55.414852" 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-04-25T23:36:55.421531" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.421424" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.421405" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.422815" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.422707" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.422688" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:36:55.423384" level="INFO">${karaf_connection_index} = 64</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.423024" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.423833" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:36:55.423559" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.424644" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.424378" elapsed="0.001173">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:36:55.425784" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:36:55.425830" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.424006" elapsed="0.001849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.426681" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.426390" elapsed="0.001418">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:36:55.427991" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:36:55.428038" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.426011" elapsed="0.002051"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.428988" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.428348" elapsed="0.000719">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:36:55.428139" elapsed="0.001022">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:36:55.428120" elapsed="0.001076">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.429346" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.429584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:36:55.429454" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:36:55.429435" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.429733" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:36:55.432599" elapsed="0.000169"/>
</kw>
<msg time="2026-04-25T23:36:55.432839" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:36:55.431953" elapsed="0.000982"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.433733" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.434538" 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-04-25T23:36:55.430552" elapsed="0.004100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:36:55.429985" elapsed="0.004870"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.422385" elapsed="0.012580">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</status>
</kw>
<msg time="2026-04-25T23:36:55.435069" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:36:55.435114" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fourth"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.421754" elapsed="0.013383"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.435321" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.435213" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.435194" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.436347" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:36:55.436237" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.436217" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.436698" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:36:55.436804" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:36:55.436553" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.437226" level="INFO">{1: 64}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:36:55.436970" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:36:55.437705" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:36:55.437444" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.438241" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:36:55.438734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:36:55.438785" level="INFO">${old_connection_index} = 64</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.437896" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:36:55.439607" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.441558" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.441144" elapsed="0.000963">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.440011" elapsed="0.002172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:36:55.443668" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.442407" elapsed="0.001683"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:36:55.439109" elapsed="0.005083"/>
</kw>
<status status="PASS" start="2026-04-25T23:36:55.438887" elapsed="0.005356"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.438868" elapsed="0.005400"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:36:55.445194" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.444792" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:36:55.445269" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:36:55.445420" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:36:55.444466" elapsed="0.000978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.445585" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.446283" level="INFO">index=65
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:36:55.446174" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:36:55.446545" elapsed="0.002064"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.449050" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:36:55.451154" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.448788" elapsed="0.002742">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:36:55.461049" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:36:55.461432" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:36:55.459693" elapsed="0.001859"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.461896" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.462147" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:36:55.452311" elapsed="0.009976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:36:55.451811" elapsed="0.010524"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.435779" elapsed="0.026638">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.462946" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:36:55.463022" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.421087" elapsed="0.042065">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:36:55.463258" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:36:55.463302" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.416707" elapsed="0.046618"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:36:55.463647" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:36:55.463407" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-25T23:36:55.463389" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:36:55.416562" elapsed="0.047203"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:36:55.416387" elapsed="0.047408"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:36:55.414085" elapsed="0.049762"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:36:55.409625" elapsed="0.054276"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:36:55.409214" elapsed="0.054731"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:36:55.406533" elapsed="0.057463"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:36:55.465260" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-2-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-2-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:36:55.465415" level="INFO">${data} = &lt;rpc message-id="51" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:36:55.465042" elapsed="0.000401"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:36:55.465487" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:36:55.465635" level="INFO">${request} = &lt;rpc message-id="51" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:36:55.464739" elapsed="0.000940"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.468986" level="INFO">&lt;rpc message-id="51" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:36:55.466398" elapsed="0.002647"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.470096" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:36:55.469189" elapsed="0.000962"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:36:55.527433" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CARMID&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;model&gt;Toyota Aurion&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Toyota&lt;/manufacturer&gt; [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;year&gt;2006&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `2006'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;category&gt;sedan&lt;/category&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTMID&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;40&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `40'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CARMID&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTMID&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:36:55.470305" elapsed="0.057387"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:36:55.466108" elapsed="0.061644"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.528451" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.527894" elapsed="60.001272">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.529276" elapsed="0.000042"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.465821" elapsed="60.063630">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.529516" elapsed="0.000019"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.464435" elapsed="60.065189">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.529900" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.530114" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.530281" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.530445" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.530510" elapsed="0.000017"/>
</return>
<arg>merge-multiple-2</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.464159" elapsed="60.066462">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:37:55.532040" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.531629" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.531607" elapsed="0.000522"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.532269" elapsed="0.000396"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.537709" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:37:55.537256" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:37:55.537962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.537815" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.537796" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.538461" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:37:55.538161" elapsed="0.000327"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:37:55.538929" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Multiple_Batch_Merge_Fourth</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.538639" elapsed="0.000317"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:37:55.539309" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:37:55.539130" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.539849" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:37:55.539483" elapsed="0.000394"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.540333" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:37:55.540021" elapsed="0.000341"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.541057" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:37:55.540504" elapsed="0.000609"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.541558" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.541257" elapsed="0.000350"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:37:55.536959" elapsed="0.004725"/>
</kw>
<status status="PASS" start="2026-04-25T23:37:55.531406" elapsed="0.010330"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:37:55.530961" elapsed="0.010817"/>
</kw>
<doc>Use a merge request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-25T23:36:55.405968" elapsed="60.135849">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t26" name="Edit_Config_Multiple_Batch_Merge_Fifth" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:37:55.545394" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:37:55.545146" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.546627" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.546517" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.546499" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.551156" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.551049" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.551031" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.552187" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:37:55.551809" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.552684" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:37:55.552376" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:37:55.552755" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:37:55.552911" 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-04-25T23:37:55.551435" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.558200" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.558093" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.558074" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.559492" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.559387" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.559369" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:37:55.560077" level="INFO">${karaf_connection_index} = 65</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.559715" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.560501" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.560251" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.561348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.561075" elapsed="0.001178">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:37:55.562470" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:37:55.562517" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.560698" elapsed="0.001842"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.563421" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.563143" elapsed="0.001328">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:37:55.564674" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:37:55.564723" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.562713" elapsed="0.002033"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.565635" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.565034" elapsed="0.000697">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:37:55.564824" elapsed="0.001003">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:37:55.564804" elapsed="0.001057">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.566011" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.566226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.566096" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:37:55.566079" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.566353" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.569251" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:37:55.569473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.568554" elapsed="0.001015"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.570370" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.571209" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.567210" elapsed="0.004112"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:37:55.566607" elapsed="0.004833"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.559079" elapsed="0.012445">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</status>
</kw>
<msg time="2026-04-25T23:37:55.571626" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:37:55.571687" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Config_Multiple_Batch_Merge_Fifth"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.558404" elapsed="0.013308"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.571898" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.571790" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.571771" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.573024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.572911" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.572890" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.573360" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:37:55.573465" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.573231" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.573911" level="INFO">{1: 65}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.573636" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.574376" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.574130" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.574929" elapsed="0.000345"/>
</kw>
<msg time="2026-04-25T23:37:55.575374" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:37:55.575421" level="INFO">${old_connection_index} = 65</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.574566" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.576252" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.578309" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.577886" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.576641" elapsed="0.002299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.580298" elapsed="0.000506"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.579179" elapsed="0.001693"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:37:55.575745" elapsed="0.005229"/>
</kw>
<status status="PASS" start="2026-04-25T23:37:55.575521" elapsed="0.005505"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.575502" elapsed="0.005550"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:37:55.581971" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.581553" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:37:55.582046" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:37:55.582197" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.581243" elapsed="0.000978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.582363" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.583081" level="INFO">index=66
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.582948" elapsed="0.000262"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.583346" elapsed="0.002034"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.585974" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:37:55.588308" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.585531" elapsed="0.003171">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.600948" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:37:55.601326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.599532" elapsed="0.001883"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.601744" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.601992" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.589466" elapsed="0.012667"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:37:55.588965" elapsed="0.013217"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.572343" elapsed="0.029921">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.602621" elapsed="0.000180"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.602855" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.557753" elapsed="0.045209">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:37:55.603083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:37:55.603126" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.553296" elapsed="0.049854"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.603467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.603227" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.603209" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:37:55.553166" elapsed="0.050402"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:37:55.552991" elapsed="0.050608"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:37:55.550679" elapsed="0.052989"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:37:55.546228" elapsed="0.057530"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.545811" elapsed="0.057997"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:37:55.543004" elapsed="0.060857"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:37:55.605136" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-3-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-3-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:37:55.605295" level="INFO">${data} = &lt;rpc message-id="52" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:37:55.604916" elapsed="0.000408"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:37:55.605369" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:37:55.605517" level="INFO">${request} = &lt;rpc message-id="52" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
&lt;target&gt;
&lt;candidate/&gt;
&lt;/target&gt;
&lt;default-operation&gt;merge&lt;/default-operation&gt;
&lt;config&gt;
&lt;cars xmlns="urn:opendaylight:...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:37:55.604592" elapsed="0.000954"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.609202" level="INFO">&lt;rpc message-id="52" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:37:55.606284" elapsed="0.002997"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.610243" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:37:55.609451" elapsed="0.000867"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.637685" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CAROLD2&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;model&gt;Camry&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;manufacturer&gt;Toyota&lt;/manufacturer&gt; [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;year&gt;1982&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `1982'
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:37:55.610489" elapsed="0.027393"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:37:55.605991" elapsed="0.031955"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.665380" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;
[?2004l-bash: syntax error near unexpected token `65'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:37:55.665529" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bas...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:37:55.638143" elapsed="0.027418"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:37:55.665612" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:37:55.665802" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bas...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:37:55.605701" elapsed="0.060133"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:37:55.665879" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:37:55.666026" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bas...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:37:55.604303" elapsed="0.061753"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:37:55.667068" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-3-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-3-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:37:55.667206" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="52"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:37:55.666828" elapsed="0.000406"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:37:55.667279" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:37:55.667427" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="52"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:37:55.666501" elapsed="0.000960"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:37:55.667505" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:37:55.667663" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="52"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:37:55.666199" elapsed="0.001493"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:37:55.668044" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bas...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.667836" elapsed="0.000238"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:37:55.668452" level="INFO">${actual} = [?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;
[?2004l-bash:...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:37:55.668218" elapsed="0.000266"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:37:55.669089" level="FAIL">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `65\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.668633" elapsed="0.000762">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `65\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.669481" elapsed="0.000259"/>
</return>
<arg>merge-multiple-3</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.604028" elapsed="0.065813">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `65\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:37:55.671119" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.670730" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.670711" elapsed="0.000500"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.671347" elapsed="0.000337"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.676361" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:37:55.675931" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:37:55.676630" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.676462" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.676443" elapsed="0.000270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.677146" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:37:55.676846" elapsed="0.000326"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:37:55.677569" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Config_Multiple_Batch_Merge_Fifth</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.677315" elapsed="0.000280"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:37:55.677929" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:37:55.677756" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.678434" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:37:55.678095" elapsed="0.000366"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.678925" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:37:55.678601" elapsed="0.000352"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.679533" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"

FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `65\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:37:55.679103" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.680055" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.679761" elapsed="0.000340"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:37:55.675625" elapsed="0.004530"/>
</kw>
<status status="PASS" start="2026-04-25T23:37:55.670505" elapsed="0.009699"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:37:55.670157" elapsed="0.010088"/>
</kw>
<doc>Add a "name4" subelement to the element and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.542346" elapsed="0.137939">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"

FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;id&gt;CUSTOLD2&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;age&gt;65&lt;/age&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `65\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-id&gt;CAROLD2&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;   &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t27" name="Commit_Multiple_Merge" line="178">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:37:55.683266" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:37:55.682994" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.684487" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.684380" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.684362" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.689154" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.689046" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.689029" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.690195" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:37:55.689815" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.690683" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:37:55.690370" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:37:55.690755" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:37:55.690910" 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-04-25T23:37:55.689437" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.695991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.695884" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.695865" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.697233" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.697127" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.697110" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:37:55.697798" level="INFO">${karaf_connection_index} = 66</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.697428" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.698210" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.697967" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.699026" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.698766" elapsed="0.001179">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:37:55.700123" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:37:55.700169" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.698381" elapsed="0.001811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.701004" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.700735" elapsed="0.001472">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:37:55.702382" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:37:55.702427" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.700346" elapsed="0.002105"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.703353" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.702747" elapsed="0.000822">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:37:55.702525" elapsed="0.001157">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:37:55.702507" elapsed="0.001211">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.703896" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.704116" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.703987" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:37:55.703969" elapsed="0.000274"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.704276" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.707019" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:37:55.707259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.706418" elapsed="0.000935"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.708198" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.709012" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.705103" elapsed="0.004023"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:37:55.704522" elapsed="0.004719"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.696829" elapsed="0.012498">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</status>
</kw>
<msg time="2026-04-25T23:37:55.709428" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:37:55.709471" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Merge"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.696192" elapsed="0.013303"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.709780" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.709570" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.709552" elapsed="0.000296"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.710605" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:37:55.710503" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.710485" elapsed="0.000207"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.710949" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:37:55.711050" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.710834" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.711482" level="INFO">{1: 66}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.711227" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:37:55.711919" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:37:55.711677" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.712446" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:37:55.712878" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:37:55.712924" level="INFO">${old_connection_index} = 66</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.712106" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.713833" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.715797" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.715367" elapsed="0.000965">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.714221" elapsed="0.002187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.717855" elapsed="0.000348"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.716629" elapsed="0.001635"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:37:55.713230" elapsed="0.005133"/>
</kw>
<status status="PASS" start="2026-04-25T23:37:55.713020" elapsed="0.005393"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.713002" elapsed="0.005436"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:37:55.719408" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.718992" elapsed="0.000444"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:37:55.719484" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:37:55.719635" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.718677" elapsed="0.000997"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.719818" elapsed="0.000396"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.720480" level="INFO">index=67
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:37:55.720373" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:37:55.720754" elapsed="0.002199"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.723385" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:37:55.724380" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.723124" elapsed="0.001640">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:37:55.734021" elapsed="0.000313"/>
</kw>
<msg time="2026-04-25T23:37:55.734394" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:37:55.732819" 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-04-25T23:37:55.734814" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.735061" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:37:55.725511" elapsed="0.009699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:37:55.725021" elapsed="0.010237"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.710216" elapsed="0.025121">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.735986" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:37:55.736061" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.695537" elapsed="0.040628">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:37:55.736268" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:37:55.736311" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.691323" elapsed="0.045010"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:37:55.736644" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:37:55.736408" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-25T23:37:55.736391" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:37:55.691194" elapsed="0.045566"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:37:55.690990" elapsed="0.045798"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:37:55.688683" elapsed="0.048159"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:37:55.684097" elapsed="0.052798"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:37:55.683681" elapsed="0.053257"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:37:55.680993" elapsed="0.056032"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:37:55.738290" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:37:55.738420" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="53"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:37:55.738071" elapsed="0.000375"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:37:55.738492" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:37:55.738645" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="53"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:37:55.737770" elapsed="0.000917"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:37:55.739432" elapsed="0.000410"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.740622" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:37:55.739982" elapsed="0.000709"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:37:55.746586" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="53"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:37:55.740829" elapsed="0.005844"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:37:55.739134" elapsed="0.007599"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.747394" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.746872" elapsed="60.001190">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.748174" elapsed="0.000037"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.738826" elapsed="60.009512">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.748404" elapsed="0.000016"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.737462" elapsed="60.011044">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.748789" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.749006" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.749169" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.749341" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.749406" elapsed="0.000016"/>
</return>
<arg>merge-multiple-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.737187" elapsed="60.012321">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:38:55.752857" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:38:55.752439" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.752419" elapsed="0.000526"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:38:55.753083" elapsed="0.000379"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.758152" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:38:55.757720" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:38:55.758471" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.758324" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.758304" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.758988" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:38:55.758685" elapsed="0.000331"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:38:55.759433" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Multiple_Merge</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:38:55.759161" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:38:55.759798" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:38:55.759607" elapsed="0.000217"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.760315" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:38:55.759967" elapsed="0.000376"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.760827" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:38:55.760488" elapsed="0.000366"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.761451" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:38:55.761001" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.761964" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:38:55.761664" elapsed="0.000348"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:38:55.757408" elapsed="0.004660"/>
</kw>
<status status="PASS" start="2026-04-25T23:38:55.752225" elapsed="0.009893"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:38:55.751824" elapsed="0.010336"/>
</kw>
<doc>Commit the changes and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:37:55.680541" elapsed="60.081661">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t28" name="Multiple_Batch_Data_In_Running_Config" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:38:55.765394" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:38:55.765147" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.766634" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.766523" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.766505" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.771317" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.771209" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.771190" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.772357" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:38:55.771975" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.772901" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:38:55.772531" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:38:55.773006" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:38:55.773169" 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-04-25T23:38:55.771594" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.778267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.778157" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.778137" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.779540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.779434" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.779416" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:38:55.780122" 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-04-25T23:38:55.779757" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.780544" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:38:55.780295" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.781408" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.781140" elapsed="0.001181">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:38:55.782511" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:38:55.782558" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.780762" elapsed="0.001820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.783408" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.783136" elapsed="0.001289">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:38:55.784605" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:38:55.784678" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.782752" elapsed="0.001953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.785602" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.785000" elapsed="0.000719">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:38:55.784792" elapsed="0.001023">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:38:55.784773" elapsed="0.001226">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.786152" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.786369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:38:55.786239" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:38:55.786221" elapsed="0.000244"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.786498" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:38:55.789405" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:38:55.789629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:38:55.788719" elapsed="0.001111"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.790608" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.791423" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:38:55.787337" elapsed="0.004198"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:38:55.786766" elapsed="0.004898"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.779134" elapsed="0.012649">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</status>
</kw>
<msg time="2026-04-25T23:38:55.791888" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:38:55.791931" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.778478" elapsed="0.013477"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.792141" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.792033" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.792014" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.793022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:38:55.792917" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.792899" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.793350" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:38:55.793453" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:38:55.793225" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.793987" level="INFO">{1: 67}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:38:55.793619" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:38:55.794415" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:38:55.794173" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:38:55.794973" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:38:55.795387" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:38:55.795433" level="INFO">${old_connection_index} = 67</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.794605" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:38:55.796249" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.798352" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.797936" elapsed="0.000961">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.796634" elapsed="0.002340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:38:55.800310" elapsed="0.000385"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.799197" elapsed="0.001578"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:38:55.795754" elapsed="0.005126"/>
</kw>
<status status="PASS" start="2026-04-25T23:38:55.795532" elapsed="0.005402"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.795514" elapsed="0.005448"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:38:55.801900" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:38:55.801465" elapsed="0.000465"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:38:55.801981" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:38:55.802132" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:38:55.801154" elapsed="0.001003"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:38:55.802299" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.802993" level="INFO">index=68
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:38:55.802883" 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-04-25T23:38:55.803258" elapsed="0.002230"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.806116" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:38:55.808080" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.805850" elapsed="0.002605">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:38:55.819852" elapsed="0.000467"/>
</kw>
<msg time="2026-04-25T23:38:55.820404" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:38:55.818032" elapsed="0.002503"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.821081" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.821450" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:38:55.809260" elapsed="0.012458"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:38:55.808744" elapsed="0.013050"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.792585" elapsed="0.029329">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.822242" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:38:55.822315" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.777820" elapsed="0.044599">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:38:55.822525" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:38:55.822568" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.773554" elapsed="0.049038"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:38:55.823080" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:38:55.822712" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-25T23:38:55.822692" elapsed="0.000467"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:38:55.773424" elapsed="0.049758"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:38:55.773249" elapsed="0.049963"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:38:55.770834" elapsed="0.052433"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:38:55.766227" elapsed="0.057096"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:38:55.765810" elapsed="0.057558"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:38:55.763149" elapsed="0.060273"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:38:55.824393" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:38:55.824552" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:38:55.824174" elapsed="0.000407"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:38:55.824626" elapsed="0.000087"/>
</return>
<msg time="2026-04-25T23:38:55.824855" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:38:55.823867" elapsed="0.001020"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.829197" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:38:55.825619" elapsed="0.003635"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.830169" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:38:55.829431" elapsed="0.000792"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:38:55.838589" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:38:55.830409" elapsed="0.008271"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:38:55.825321" elapsed="0.013420"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.839508" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.838883" elapsed="60.001368">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.840365" elapsed="0.000039"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.825029" elapsed="60.015513">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.840611" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>merge-multiple-check</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.823573" elapsed="60.017177">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Multiple_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:39:55.840995" elapsed="0.000028"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:39:55.842801" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.842368" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.842022" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.843034" elapsed="0.000391"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.848166" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:39:55.847734" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:39:55.848422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.848272" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.848253" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.848935" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:39:55.848619" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:39:55.849378" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Multiple_Batch_Data_In_Running_Config</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.849107" elapsed="0.000298"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:39:55.849745" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:39:55.849551" elapsed="0.000220"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.850275" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:39:55.849921" elapsed="0.000381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.850798" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:39:55.850447" elapsed="0.000380"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.851518" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:39:55.851060" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.852033" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:39:55.851732" elapsed="0.000350"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:39:55.847424" elapsed="0.004714"/>
</kw>
<status status="PASS" start="2026-04-25T23:39:55.841819" elapsed="0.010370"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:39:55.841376" elapsed="0.010857"/>
</kw>
<doc>Check that the 3 subelements are now present in the running configuration.</doc>
<status status="FAIL" start="2026-04-25T23:38:55.762557" elapsed="60.089716">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t29" name="Abort_Connection_To_Simulate_Session_Failure" line="187">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:39:55.855561" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:39:55.855310" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.856821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.856709" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.856689" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.861323" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.861215" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.861197" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.862369" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:39:55.861987" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.862892" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:39:55.862545" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:39:55.862972" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:39:55.863134" 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-04-25T23:39:55.861606" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.868412" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.868303" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.868283" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.869720" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.869590" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.869572" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:39:55.870284" level="INFO">${karaf_connection_index} = 68</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.869922" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.870751" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.870459" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.871574" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.871306" elapsed="0.001171">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:39:55.872708" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:39:55.872756" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.870928" elapsed="0.001852"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.873602" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.873325" elapsed="0.001319">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:39:55.874846" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:39:55.874892" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.872939" elapsed="0.001977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.875823" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.875200" elapsed="0.000703">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:39:55.874992" elapsed="0.001005">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:39:55.874973" elapsed="0.001059">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.876183" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.876409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.876272" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:39:55.876255" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.876538" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.879415" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:39:55.879637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.878776" elapsed="0.000975"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.880541" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.881369" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.877382" elapsed="0.004100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:39:55.876809" 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="FAIL" start="2026-04-25T23:39:55.869287" elapsed="0.012411">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</status>
</kw>
<msg time="2026-04-25T23:39:55.881803" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:39:55.881848" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Abort_Connection_To_Simulate_Session_Failure"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.868621" elapsed="0.013251"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.882059" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.881950" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.881931" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.883223" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.883112" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.883091" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.883560" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:39:55.883681" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.883433" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.884113" level="INFO">{1: 68}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:39:55.883855" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.884592" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:39:55.884343" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.885254" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:39:55.885685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:39:55.885733" level="INFO">${old_connection_index} = 68</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.884902" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.886538" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.888606" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.888188" elapsed="0.000964">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.887057" elapsed="0.002172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.890570" elapsed="0.000521"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.889454" elapsed="0.001701"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:39:55.886043" elapsed="0.005213"/>
</kw>
<status status="PASS" start="2026-04-25T23:39:55.885833" elapsed="0.005474"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.885814" elapsed="0.005519"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:39:55.892254" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.891855" elapsed="0.000425"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:39:55.892327" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:39:55.892477" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.891528" elapsed="0.000973"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.892643" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.893336" level="INFO">index=69
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.893227" 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-04-25T23:39:55.893595" elapsed="0.002078"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.896083" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:39:55.898407" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.895825" elapsed="0.003136">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.910323" elapsed="0.000778"/>
</kw>
<msg time="2026-04-25T23:39:55.911185" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.908614" elapsed="0.002696"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.911667" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.911920" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.899755" elapsed="0.012306"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:39:55.899221" elapsed="0.012890"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.882508" elapsed="0.029685">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.912559" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.912632" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.867964" elapsed="0.044792">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:39:55.912860" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:39:55.912904" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.863521" elapsed="0.049407"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.913243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.913004" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.912985" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:39:55.863390" elapsed="0.049953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:39:55.863214" elapsed="0.050159"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:39:55.860853" elapsed="0.052573"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:39:55.856404" elapsed="0.057077"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.855991" elapsed="0.057536"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:39:55.853288" elapsed="0.060291"/>
</kw>
<kw name="Abort_ODL_Netconf_Connection">
<if>
<branch type="IF" condition="${ssh_netconf_pid} == -1">
<return>
<status status="PASS" start="2026-04-25T23:39:55.914087" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-25T23:39:55.913981" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.913964" elapsed="0.000204"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<var>${kill_command}</var>
<arg>kill ${ssh_netconf_pid}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.914302" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf_pid}</arg>
<arg>-1</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.914473" elapsed="0.000020"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_control}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.914628" elapsed="0.000230"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${kill_command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.914993" elapsed="0.000021"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.915144" elapsed="0.000020"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_netconf}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.915289" elapsed="0.000019"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.915436" elapsed="0.000020"/>
</kw>
<doc>Correctly close the Netconf connection and make sure it is really dead.</doc>
<status status="PASS" start="2026-04-25T23:39:55.913797" elapsed="0.001712"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:39:55.916689" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.916311" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.916294" elapsed="0.000482"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.916907" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.922030" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:39:55.921612" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-25T23:39:55.922273" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-25T23:39:55.922132" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.922113" elapsed="0.000239"/>
</if>
<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-04-25T23:39:55.922488" elapsed="0.000021"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.922708" elapsed="0.000023"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.922911" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.923067" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.923223" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.923376" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.923528" elapsed="0.000020"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:39:55.921319" elapsed="0.002286"/>
</kw>
<status status="PASS" start="2026-04-25T23:39:55.916105" elapsed="0.007567"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:39:55.915764" elapsed="0.007953"/>
</kw>
<doc>Simulate session failure by disconnecting without terminating the session.</doc>
<status status="PASS" start="2026-04-25T23:39:55.852662" elapsed="0.071094"/>
</test>
<test id="s1-s3-s1-t30" name="Reconnect_To_ODL_Netconf_After_Session_Failure" line="191">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:39:55.927020" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:39:55.926769" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.928249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.928140" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.928122" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.932775" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.932667" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.932636" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.933816" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:39:55.933421" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.934289" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:39:55.933991" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:39:55.934359" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:39:55.934513" 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-04-25T23:39:55.933056" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.939639" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.939532" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.939513" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.940935" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.940795" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.940776" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:39:55.941488" level="INFO">${karaf_connection_index} = 69</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.941133" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.941922" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.941676" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.942765" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.942466" elapsed="0.001315">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:39:55.943959" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:39:55.944007" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.942094" elapsed="0.001937"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.944898" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.944607" elapsed="0.001310">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:39:55.946092" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:39:55.946139" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.944224" elapsed="0.001939"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.947073" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.946446" elapsed="0.000706">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:39:55.946239" elapsed="0.001008">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:39:55.946219" elapsed="0.001062">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.947429" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.947644" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.947516" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:39:55.947498" elapsed="0.000257"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.947787" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.950520" elapsed="0.000191"/>
</kw>
<msg time="2026-04-25T23:39:55.950785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.949937" elapsed="0.000943"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.951714" elapsed="0.000042"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.952525" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.948588" elapsed="0.004049"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:39:55.948030" elapsed="0.004738"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.940469" elapsed="0.012384">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</status>
</kw>
<msg time="2026-04-25T23:39:55.952953" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:39:55.952996" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Reconnect_To_ODL_Netconf_After_Session_Failure"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.939862" elapsed="0.013158"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.953207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.953094" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.953076" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.954150" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:39:55.954046" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.954029" elapsed="0.000186"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.954471" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:39:55.954571" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.954358" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.955018" level="INFO">{1: 69}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:39:55.954763" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:39:55.955436" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:39:55.955197" 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-04-25T23:39:55.955982" elapsed="0.000311"/>
</kw>
<msg time="2026-04-25T23:39:55.956425" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:39:55.956472" level="INFO">${old_connection_index} = 69</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.955620" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.957284" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.959435" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.958881" elapsed="0.001146">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.957708" elapsed="0.002395"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.961425" elapsed="0.000473"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.960323" elapsed="0.001638"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:39:55.956793" elapsed="0.005269"/>
</kw>
<status status="PASS" start="2026-04-25T23:39:55.956570" elapsed="0.005543"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.956552" elapsed="0.005587"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:39:55.963064" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.962638" elapsed="0.000453"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:39:55.963139" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:39:55.963289" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.962327" elapsed="0.000986"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:39:55.963454" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.964131" level="INFO">index=70
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:39:55.964024" 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-04-25T23:39:55.964387" elapsed="0.002102"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.966930" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:39:55.967875" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.966637" elapsed="0.001603">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:39:55.977529" elapsed="0.000379"/>
</kw>
<msg time="2026-04-25T23:39:55.977966" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:39:55.976233" 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-04-25T23:39:55.978363" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.978613" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:39:55.969000" elapsed="0.009780"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:39:55.968495" elapsed="0.010333"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.953638" elapsed="0.025269">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.979219" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:39:55.979323" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.939197" elapsed="0.040232">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:39:55.979532" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:39:55.979576" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.934971" elapsed="0.044628"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:39:55.979934" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:39:55.979690" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-25T23:39:55.979671" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:39:55.934840" elapsed="0.045191"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:39:55.934592" elapsed="0.045468"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:39:55.932295" elapsed="0.047817"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:39:55.927855" elapsed="0.052311"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:39:55.927429" elapsed="0.052781"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:39:55.924503" elapsed="0.055758"/>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<kw name="Reopen_ODL_Netconf_Connection">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:39:55.984210" level="INFO">sshpass -p admin ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@127.0.0.1 -p 2830 -s netconf</msg>
<arg>sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:39:55.980947" elapsed="0.003320"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:40:55.985260" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${hello}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.984410" elapsed="60.002092">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_control}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.987050" elapsed="0.000072"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${pid}</var>
<arg>ps -A | grep sshpass | awk '{print $1}'</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.987448" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf_pid}</arg>
<arg>${pid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.987848" elapsed="0.000046"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_netconf}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.988186" elapsed="0.000044"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:40:55.988356" elapsed="0.000042"/>
</return>
<var>${hello}</var>
<doc>Reopen a closed netconf connection.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.980697" elapsed="60.007934">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Get_Data">
<var>${hello_message}</var>
<arg>hello</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.989012" elapsed="0.000023"/>
</kw>
<kw name="Transmit_Message">
<arg>${hello_message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:55.989180" elapsed="0.000022"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-25T23:40:55.989242" elapsed="0.000016"/>
</return>
<doc>Open a prepared netconf connecion.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.980409" elapsed="60.008934">No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:40:55.991043" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:40:55.990616" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:55.990595" elapsed="0.000551"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:40:55.991282" elapsed="0.000406"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:40:55.996399" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:40:55.995937" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:40:55.996822" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:55.996576" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:55.996555" elapsed="0.000332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:40:55.997345" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:40:55.997024" elapsed="0.000348"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:40:55.997807" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Reconnect_To_ODL_Netconf_After_Session_Failure</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:40:55.997518" elapsed="0.000316"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:40:55.998156" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:40:55.997981" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:40:55.998694" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure"
reference somewhere ins...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:40:55.998329" elapsed="0.000395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:40:55.999179" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:40:55.998869" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:40:55.999811" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:40:55.999349" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.000329" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:40:56.000013" elapsed="0.000369"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:40:55.995631" elapsed="0.004808"/>
</kw>
<status status="PASS" start="2026-04-25T23:40:55.990402" elapsed="0.010087"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:40:55.989993" elapsed="0.010539"/>
</kw>
<doc>Reconnect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-25T23:39:55.923992" elapsed="60.076580">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:
[?2004lssh: connect to host 127.0.0.1 port 2830: Connection refused
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t31" name="Multiple_Batch_Data_In_Running_Config_After_Session_Failure" 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-04-25T23:40:56.004159" elapsed="0.000245"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:40:56.003863" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.005466" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.005355" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.005335" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.011753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.011630" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.011612" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.012865" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:40:56.012454" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.013375" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:40:56.013076" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:40:56.013445" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:40:56.013601" 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-04-25T23:40:56.012048" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.018727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.018602" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.018582" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.020034" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.019925" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.019907" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:40:56.020635" level="INFO">${karaf_connection_index} = 70</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:40:56.020237" elapsed="0.000475"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.021118" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:40:56.020863" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.021963" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.021690" elapsed="0.001198">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:40:56.023071" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:40:56.023117" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.021294" elapsed="0.001847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.023999" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.023710" elapsed="0.001345">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:40:56.025234" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:40:56.025281" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.023298" elapsed="0.002007"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.026214" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.025589" elapsed="0.000706">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:40:56.025381" elapsed="0.001011">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:40:56.025362" elapsed="0.001209">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.026737" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.026957" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:40:56.026826" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:40:56.026809" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.027090" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:40:56.030075" elapsed="0.000163"/>
</kw>
<msg time="2026-04-25T23:40:56.030311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:40:56.029359" elapsed="0.001049"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.031213" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.032090" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:40:56.027956" elapsed="0.004255"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:40:56.027346" elapsed="0.005051"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.019571" elapsed="0.012913">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</status>
</kw>
<msg time="2026-04-25T23:40:56.032587" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:40:56.032631" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Multiple_Batch_Data_In_Running_Config_After_Session_Failure"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.018937" elapsed="0.013834"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.032964" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.032854" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.032834" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.033819" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:40:56.033711" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.033692" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.034154" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:40:56.034258" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:40:56.034024" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.034698" level="INFO">{1: 70}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:40:56.034423" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:40:56.035124" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:40:56.034882" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:40:56.035674" elapsed="0.000328"/>
</kw>
<msg time="2026-04-25T23:40:56.036106" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:40:56.036152" level="INFO">${old_connection_index} = 70</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.035312" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:40:56.037095" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.039065" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.038622" elapsed="0.000983">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.037483" elapsed="0.002227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:40:56.041200" elapsed="0.000361"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.039944" elapsed="0.001682"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:40:56.036484" elapsed="0.005265"/>
</kw>
<status status="PASS" start="2026-04-25T23:40:56.036250" elapsed="0.005566"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.036232" elapsed="0.005612"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:40:56.042786" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:40:56.042357" elapsed="0.000457"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:40:56.042863" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:40:56.043023" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:40:56.042042" elapsed="0.001006"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:40:56.043193" elapsed="0.000411"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.043902" level="INFO">index=71
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:40:56.043787" 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-04-25T23:40:56.044217" elapsed="0.002274"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.046935" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:40:56.049182" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.046645" elapsed="0.002910">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:40:56.061759" elapsed="0.000325"/>
</kw>
<msg time="2026-04-25T23:40:56.062144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:40:56.059996" elapsed="0.002238"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.062582" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.062885" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:40:56.050336" elapsed="0.012696"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:40:56.049835" elapsed="0.013247"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.033403" elapsed="0.029761">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.063492" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:40:56.063567" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.018258" elapsed="0.045440">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:40:56.063812" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:40:56.063857" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.014026" elapsed="0.049855"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:40:56.064230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:40:56.063961" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-25T23:40:56.063941" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:40:56.013895" elapsed="0.050451"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:40:56.013710" elapsed="0.050666"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:40:56.011265" elapsed="0.053167"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:40:56.005053" elapsed="0.059445"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:40:56.004598" elapsed="0.059949"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:40:56.001722" elapsed="0.062878"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:40:56.065818" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:40:56.065976" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:40:56.065577" elapsed="0.000428"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:40:56.066051" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:40:56.066204" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:40:56.065265" elapsed="0.000967"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.069979" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="54"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:40:56.067033" elapsed="0.003024"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.070933" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:40:56.070203" elapsed="0.000786"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:40:56.080617" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:40:56.071161" elapsed="0.009558"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:40:56.066729" elapsed="0.014050"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.081527" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.080921" elapsed="60.001337">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.082373" elapsed="0.000040"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.066412" elapsed="60.016145">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.082626" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>merge-multiple-check</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.064987" elapsed="60.017760">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Check_Multiple_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-25T23:41:56.082983" elapsed="0.000028"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:41:56.084805" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:56.084382" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.084033" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:56.085040" elapsed="0.000393"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.090200" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:41:56.089762" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:41:56.090452" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.090306" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.090287" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.090973" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:41:56.090650" elapsed="0.000350"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:41:56.091440" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Multiple_Batch_Data_In_Running_Config_After_Session_Failure</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.091146" elapsed="0.000323"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:41:56.091818" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:41:56.091622" elapsed="0.000223"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.092342" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure"
reference ...</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:41:56.091993" elapsed="0.000376"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.092845" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug...</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:41:56.092512" elapsed="0.000486"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.093607" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:41:56.093149" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.094128" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:56.093827" elapsed="0.000350"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:41:56.089450" elapsed="0.004783"/>
</kw>
<status status="PASS" start="2026-04-25T23:41:56.083832" elapsed="0.010453"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:41:56.083356" elapsed="0.010971"/>
</kw>
<doc>Check that the 3 subelements are now present in the running configuration.</doc>
<status status="FAIL" start="2026-04-25T23:40:56.001033" elapsed="60.093334">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t32" name="Edit_Multiple_Merge_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-04-25T23:41:56.098456" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:41:56.098204" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.099745" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.099618" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.099598" elapsed="0.000215"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.104236" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.104130" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.104113" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.105271" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:41:56.104890" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.105754" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:41:56.105445" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:41:56.105825" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:41:56.105983" 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-04-25T23:41:56.104512" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.111256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.111149" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.111129" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.112540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.112435" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.112417" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:41:56.113144" level="INFO">${karaf_connection_index} = 71</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.112778" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.113573" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:56.113320" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.114456" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.114181" elapsed="0.001193">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:41:56.115590" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:41:56.115637" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.113801" elapsed="0.001876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.116502" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.116227" elapsed="0.001311">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:41:56.117740" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:41:56.117792" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.115843" elapsed="0.001972"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.118715" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_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-04-25T23:41:56.118101" elapsed="0.000700">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_Data"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:41:56.117892" elapsed="0.001004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_Data"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:41:56.117873" elapsed="0.001059">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_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-04-25T23:41:56.119082" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.119298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:56.119169" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:41:56.119152" elapsed="0.000240"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.119439" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:56.122414" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:41:56.122637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:56.121641" elapsed="0.001109"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.123691" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.124514" elapsed="0.000041"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:41:56.120295" elapsed="0.004339"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:41:56.119723" elapsed="0.005054"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.112133" elapsed="0.012732">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_Data"</status>
</kw>
<msg time="2026-04-25T23:41:56.124968" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:41:56.125013" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Edit_Multiple_Merge_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-04-25T23:41:56.111471" elapsed="0.013566"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.125226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.125117" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.125096" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.126375" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:56.126265" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.126245" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.126728" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:41:56.126834" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:41:56.126584" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.127298" level="INFO">{1: 71}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:56.127038" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:56.127759" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:56.127494" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.128301" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:41:56.128747" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:41:56.128800" level="INFO">${old_connection_index} = 71</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.127951" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:56.129611" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.131917" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.131314" elapsed="0.001142">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.130181" elapsed="0.002352"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:41:56.133915" elapsed="0.000355"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.132788" elapsed="0.001546"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:41:56.129111" elapsed="0.005325"/>
</kw>
<status status="PASS" start="2026-04-25T23:41:56.128901" elapsed="0.005588"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.128882" elapsed="0.005633"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:41:56.135457" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.135035" elapsed="0.000456"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:41:56.135543" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:41:56.135715" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:41:56.134723" elapsed="0.001018"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.135886" elapsed="0.000411"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.136564" level="INFO">index=72
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:41:56.136456" elapsed="0.000264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:41:56.136864" elapsed="0.002134"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.139411" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:41:56.141468" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.139153" elapsed="0.002795">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:56.153234" elapsed="0.000666"/>
</kw>
<msg time="2026-04-25T23:41:56.153989" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:56.151345" elapsed="0.002774"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.154590" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.155232" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:41:56.142722" elapsed="0.012718"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:41:56.142208" elapsed="0.013338"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.125789" elapsed="0.029956">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.156084" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:41:56.156159" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.110808" elapsed="0.045455">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:41:56.156367" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:41:56.156411" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.106370" elapsed="0.050064"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:56.156768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:56.156511" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:56.156493" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:41:56.106239" elapsed="0.050629"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:41:56.106065" elapsed="0.050833"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:41:56.103771" elapsed="0.053182"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:41:56.099298" elapsed="0.057709"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:56.098879" elapsed="0.058172"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:41:56.095715" elapsed="0.061388"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:41:56.158378" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:41:56.158548" level="INFO">${data} = &lt;rpc message-id="abc" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-opera...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:41:56.158159" elapsed="0.000418"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:41:56.158622" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:41:56.158791" level="INFO">${request} = &lt;rpc message-id="abc" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-opera...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:41:56.157859" elapsed="0.000960"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.162486" level="INFO">&lt;rpc message-id="abc" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:41:56.159554" elapsed="0.002989"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.163529" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:41:56.162698" elapsed="0.000885"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:41:56.437763" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=netconf
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:41:56.163825" elapsed="0.274405"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:41:56.159248" elapsed="0.279053"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.802961" level="INFO">__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `1928'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:41:57.803987" level="INFO">${reply} = 
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_cl...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:41:56.438449" elapsed="1.365569"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:41:57.804089" elapsed="0.000056"/>
</return>
<msg time="2026-04-25T23:41:57.804312" level="INFO">${reply} = 
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_cl...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:41:56.158960" elapsed="1.645385"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:41:57.804394" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:41:57.804546" level="INFO">${actual} = 
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_cl...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:41:56.157547" elapsed="1.647026"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:41:57.805726" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:41:57.805879" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="abc"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:41:57.805476" elapsed="0.000431"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:41:57.805953" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:41:57.806105" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="abc"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:41:57.805145" elapsed="0.000987"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:41:57.806175" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:41:57.806325" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="abc"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:41:57.804790" elapsed="0.001563"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:41:57.806783" level="INFO">${actual} = 
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_cl...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.806497" elapsed="0.000315"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:41:57.807189" level="INFO">${actual} = __git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clea...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:41:57.806956" elapsed="0.000262"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:41:57.808810" level="FAIL">OSError: [Errno 36] File name too long: '__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";\r\n                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then\r\n                    p="";\r\n                    return;\r\n                fi\r\n            ;;\r\n            svn-remote.*.url)\r\n                svn_remote[$((${#svn_remote[@]} + 1))]="$value";\r\n                svn_url_pattern="$svn_url_pattern\\\\|$value";\r\n                upstream=svn+git\r\n            ;;\r\n        esac;\r\n    done &lt;&lt;&lt; "$output";\r\n    local option;\r\n    for option in ${GIT_PS1_SHOWUPSTREAM};\r\n    do\r\n        case "$option" in \r\n            git | svn)\r\n                upstream="$option"\r\n            ;;\r\n            verbose)\r\n                verbose=1\r\n            ;;\r\n            legacy)\r\n                legacy=1\r\n            ;;\r\n            name)\r\n                name=1\r\n            ;;\r\n        esac;\r\n    done;\r\n    case "$upstream" in \r\n        git)\r\n            upstream="@{upstream}"\r\n        ;;\r\n        svn*)\r\n            local -a svn_upstream;\r\n            svn_upstream=($(git log --first-parent -1 \t\t\t\t\t--grep="^git-svn-id: \\(${svn_url_pattern#??}\\)" 2&gt;/dev/null));\r\n            if [[ 0 -ne ${#svn_upstream[@]} ]]; then\r\n                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};\r\n                svn_upstream=${svn_upstream%@*};\r\n                local n_stop="${#svn_remote[@]}";\r\n                for ((n=1; n &lt;= n_stop; n++))\r\n                do\r\n                    svn_upstream=${svn_upstream#${svn_remote[$n]}};\r\n                done;\r\n                if [[ -z "$svn_upstream" ]]; then\r\n                    upstream=${GIT_SVN_ID:-git-svn};\r\n                else\r\n                    upstream=${svn_upstream#/};\r\n                fi;\r\n            else\r\n                if [[ "svn+git" = "$upstream" ]]; then\r\n                    upstream="@{upstream}";\r\n                fi;\r\n            fi\r\n        ;;\r\n    esac;\r\n    if [[ -z "$legacy" ]]; then\r\n        count="$(git rev-list --count --left-right \t\t\t\t"$upstream"...HEAD 2&gt;/dev/null)";\r\n    else\r\n        local commits;\r\n        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then\r\n            local commit behind=0 ahead=0;\r\n            for commit in $commits;\r\n            do\r\n                case "$commit" in \r\n                    "&lt;"*)\r\n                        ((behind++))\r\n                    ;;\r\n                    *)\r\n                        ((ahead++))\r\n                    ;;\r\n                esac;\r\n            done;\r\n            count="$behind\t$ahead";\r\n        else\r\n            count="";\r\n        fi;\r\n    fi;\r\n    if [[ -z "$verbose" ]]; then\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p="="\r\n            ;;\r\n            "0\t"*)\r\n                p="&gt;"\r\n            ;;\r\n            *"\t0")\r\n                p="&lt;"\r\n            ;;\r\n            *)\r\n                p="&lt;&gt;"\r\n            ;;\r\n        esac;\r\n    else\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p=" u="\r\n            ;;\r\n            "0\t"*)\r\n                p=" u+${count#0\t}"\r\n            ;;\r\n            *"\t0")\r\n                p=" u-${count%\t0}"\r\n            ;;\r\n            *)\r\n                p=" u+${count#*\t}-${count%\t*}"\r\n            ;;\r\n        esac;\r\n        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then\r\n            __git_ps1_upstream_name=$(git rev-parse \t\t\t\t--abbrev-ref "$upstream" 2&gt;/dev/null);\r\n            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n                p="$p \\${__git_ps1_upstream_name}";\r\n            else\r\n                p="$p ${__git_ps1_upstream_name}";\r\n                unset __git_ps1_upstream_name;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n__git_sequencer_status () \r\n{ \r\n    local todo;\r\n    if test -f "$g/CHERRY_PICK_HEAD"; then\r\n        r="|CHERRY-PICKING";\r\n        return 0;\r\n    else\r\n        if test -f "$g/REVERT_HEAD"; then\r\n            r="|REVERTING";\r\n            return 0;\r\n        else\r\n            if __git_eread "$g/sequencer/todo" todo; then\r\n                case "$todo" in \r\n                    p[\\ \\\t] | pick[\\ \\\t]*)\r\n                        r="|CHERRY-PICKING";\r\n                        return 0\r\n                    ;;\r\n                    revert[\\ \\\t]*)\r\n                        r="|REVERTING";\r\n                        return 0\r\n                    ;;\r\n                esac;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n__load_completion () \r\n{ \r\n    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);\r\n    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;\r\n    [[ -n $cmd ]] || return 1;\r\n    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};\r\n    do\r\n        dirs+=($dir/bash-completion/completions);\r\n    done;\r\n    IFS=$ifs;\r\n    if [[ $BASH_SOURCE == */* ]]; then\r\n        dirs+=("${BASH_SOURCE%/*}/completions");\r\n    else\r\n        dirs+=(./completions);\r\n    fi;\r\n    local backslash=;\r\n    if [[ $cmd == \\\\* ]]; then\r\n        cmd="${cmd:1}";\r\n        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\\\$cmd" &amp;&amp; return 0;\r\n        backslash=\\\\;\r\n    fi;\r\n    for dir in "${dirs[@]}";\r\n    do\r\n        [[ -d $dir ]] || continue;\r\n        for compfile in "$cmd" "$cmd.bash" "_$cmd";\r\n        do\r\n            compfile="$dir/$compfile";\r\n            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then\r\n                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\\\$cmd";\r\n                return 0;\r\n            fi;\r\n        done;\r\n    done;\r\n    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;\r\n    return 1\r\n}\r\n__ltrim_colon_completions () \r\n{ \r\n    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then\r\n        local colon_word=${1%"${1##*:}"};\r\n        local i=${#COMPREPLY[*]};\r\n        while ((i-- &gt; 0)); do\r\n            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};\r\n        done;\r\n    fi\r\n}\r\n__parse_options () \r\n{ \r\n    local option option2 i IFS=\' \t\r\n,/|\';\r\n    option=;\r\n    local -a array=($1);\r\n    for i in "${array[@]}";\r\n    do\r\n        case "$i" in \r\n            ---*)\r\n                break\r\n            ;;\r\n            --?*)\r\n                option=$i;\r\n                break\r\n            ;;\r\n            -?*)\r\n                [[ -n $option ]] || option=$i\r\n            ;;\r\n            *)\r\n                break\r\n            ;;\r\n        esac;\r\n    done;\r\n    [[ -n $option ]] || return 0;\r\n    IFS=\' \t\r\n\';\r\n    if [[ $option =~ (\\[((no|dont)-?)\\]). ]]; then\r\n        option2=${option/"${BASH_REMATCH[1]}"/};\r\n        option2=${option2%%[&lt;{().[]*};\r\n        printf \'%s\\n\' "${option2/=*/=}";\r\n        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};\r\n    fi;\r\n    option=${option%%[&lt;{().[]*};\r\n    printf \'%s\\n\' "${option/=*/=}"\r\n}\r\n__reassemble_comp_words_by_ref () \r\n{ \r\n    local exclude i j line ref;\r\n    if [[ -n $1 ]]; then\r\n        exclude="[${1//[^$COMP_WORDBREAKS]/}]";\r\n    fi;\r\n    printf -v "$3" %s "$COMP_CWORD";\r\n    if [[ -v exclude ]]; then\r\n        line=$COMP_LINE;\r\n        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))\r\n        do\r\n            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do\r\n                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));\r\n                ref="$2[$j]";\r\n                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n                line=${line#*"${COMP_WORDS[i]}"};\r\n                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));\r\n                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;\r\n            done;\r\n            ref="$2[$j]";\r\n            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n            line=${line#*"${COMP_WORDS[i]}"};\r\n            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n        done;\r\n        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n    else\r\n        for i in "${!COMP_WORDS[@]}";\r\n        do\r\n            printf -v "$2[i]" %s "${COMP_WORDS[i]}";\r\n        done;\r\n    fi\r\n}\r\n_allowed_groups () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -g -- "$1"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));\r\n    fi\r\n}\r\n_allowed_users () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -u -- "${1:-$cur}"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));\r\n    fi\r\n}\r\n_apport-bug () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        ubuntu-bug | apport-bug)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions="--tag";\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-cli () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help -f --file-bug -u --update-bug -s --symptom \\\r\n                 -c --crash-file --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        apport-cli)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        -f | --file-bug)\r\n            param="-P --pid -p --package -s --symptom";\r\n            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        -s | --symptom)\r\n            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -c | --crash-file)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-collect () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-collect)\r\n            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))\r\n        ;;\r\n        -p | --package)\r\n            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))\r\n        ;;\r\n        --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            if [[ "${COMP_WORDS[*]}" =~ .*\\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then\r\n                COMPREPLY=($( compgen -W "--tag" -- $cur));\r\n            else\r\n                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));\r\n            fi\r\n        ;;\r\n    esac\r\n}\r\n_apport-unpack () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-unpack)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n    esac\r\n}\r\n_apport_parameterless () \r\n{ \r\n    local param;\r\n    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";\r\n    COMPREPLY=($( compgen -W "$param" -- $cur))\r\n}\r\n_apport_symptoms () \r\n{ \r\n    local syms;\r\n    if [ -r /usr/share/apport/symptoms ]; then\r\n        for FILE in $(ls /usr/share/apport/symptoms);\r\n        do\r\n            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\\s*\\(.*\\):" /usr/share/apport/symptoms/$FILE) ]]; then\r\n                syms="$syms ${FILE%.py}";\r\n            fi;\r\n        done;\r\n    fi;\r\n    echo $syms\r\n}\r\n_available_interfaces () \r\n{ \r\n    local PATH=$PATH:/sbin;\r\n    COMPREPLY=($({\r\n        if [[ ${1:-} == -w ]]; then\r\n            iwconfig\r\n        elif [[ ${1:-} == -a ]]; then\r\n            ifconfig || ip link show up\r\n        else\r\n            ifconfig -a || ip link show\r\n        fi\r\n    } 2&gt;/dev/null | awk         \'/^[^ \\t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }\'));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]/%[[:punct:]]/}\' -- "$cur"))\r\n}\r\n_bashcomp_try_faketty () \r\n{ \r\n    if type unbuffer &amp;&gt; /dev/null; then\r\n        unbuffer -p "$@";\r\n    else\r\n        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then\r\n            script -qaefc "$*" /dev/null;\r\n        else\r\n            "$@";\r\n        fi;\r\n    fi\r\n}\r\n_cd () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    local IFS=\'\r\n\' i j k;\r\n    compopt -o filenames;\r\n    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then\r\n        _filedir -d;\r\n        return;\r\n    fi;\r\n    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);\r\n    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);\r\n    for i in ${CDPATH//:/\'\r\n\'};\r\n    do\r\n        k="${#COMPREPLY[@]}";\r\n        for j in $(compgen -d -- $i/$cur);\r\n        do\r\n            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then\r\n                j+="/";\r\n            fi;\r\n            COMPREPLY[k++]=${j#$i/};\r\n        done;\r\n    done;\r\n    _filedir -d;\r\n    if ((${#COMPREPLY[@]} == 1)); then\r\n        i=${COMPREPLY[0]};\r\n        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then\r\n            COMPREPLY[0]="${i}/";\r\n        fi;\r\n    fi;\r\n    return\r\n}\r\n_cd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))\r\n}\r\n_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;merge&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1928\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.807362" elapsed="0.002875">OSError: [Errno 36] File name too long: '__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";...
    [ Message content over the limit has been removed. ]
...ns@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1928\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.810327" elapsed="0.000310"/>
</return>
<arg>merge-multiple-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.157271" elapsed="1.653505">OSError: [Errno 36] File name too long: '__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";...
    [ Message content over the limit has been removed. ]
...ns@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1928\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:41:57.812116" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:57.811726" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.811705" elapsed="0.000498"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:57.812382" elapsed="0.000353"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.817635" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:41:57.817021" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:41:57.817904" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.817755" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.817735" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.818398" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:41:57.818099" elapsed="0.000325"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:41:57.818844" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Edit_Multiple_Merge_Data</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.818567" elapsed="0.000304"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:41:57.819191" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:41:57.819017" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.819715" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:41:57.819356" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.820199" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:41:57.819888" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.820854" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"

OSError: [Errno 36] File name too long: '__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";...
    [ Message content over the limit has been removed. ]
...ns@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1928\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:41:57.820398" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.821373" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:57.821076" elapsed="0.000344"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:41:57.816721" elapsed="0.004754"/>
</kw>
<status status="PASS" start="2026-04-25T23:41:57.811495" elapsed="0.010061"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:41:57.811124" elapsed="0.010475"/>
</kw>
<doc>Add another subelement named "test" to the element and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:41:56.095014" elapsed="1.726626">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"

OSError: [Errno 36] File name too long: '__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";...
    [ Message content over the limit has been removed. ]
...ns@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Dixi&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1928&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1928\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t33" name="Commit_Multiple_Modules_Merge_Edit" line="204">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:41:57.824867" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:41:57.824596" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.826101" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.825991" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.825973" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.830839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.830731" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.830713" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.831890" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:41:57.831485" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.832387" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:41:57.832066" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:41:57.832459" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:41:57.832614" 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-04-25T23:41:57.831121" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.837732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.837608" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.837589" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.839009" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.838902" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.838884" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:41:57.839607" level="INFO">${karaf_connection_index} = 72</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.839242" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.840055" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:57.839801" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.840929" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.840638" elapsed="0.001191">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:41:57.842011" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:41:57.842057" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.840232" elapsed="0.001850"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.842913" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.842619" elapsed="0.001327">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:41:57.844120" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:41:57.844166" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.842239" elapsed="0.001950"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.845112" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.844489" elapsed="0.000703">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:41:57.844266" elapsed="0.001019">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:41:57.844247" elapsed="0.001223">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.845670" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.845892" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:57.845762" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:41:57.845745" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.846020" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:57.848843" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:41:57.849063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:57.848205" 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-04-25T23:41:57.850006" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.850834" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:41:57.846861" elapsed="0.004086"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:41:57.846273" elapsed="0.004788"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.838575" elapsed="0.012571">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</status>
</kw>
<msg time="2026-04-25T23:41:57.851249" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:41:57.851293" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Edit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.837947" elapsed="0.013371"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.851503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.851395" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.851376" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.852476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:41:57.852367" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.852346" elapsed="0.000229"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.852855" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:41:57.852959" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:41:57.852733" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.853386" level="INFO">{1: 72}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:57.853126" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:41:57.853939" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:41:57.853572" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.854476" elapsed="0.000352"/>
</kw>
<msg time="2026-04-25T23:41:57.854927" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:41:57.854975" level="INFO">${old_connection_index} = 72</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.854132" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:57.855799" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.857897" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.857353" elapsed="0.001081">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.856187" elapsed="0.002322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:41:57.859854" elapsed="0.000351"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.858748" elapsed="0.001519"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:41:57.855285" elapsed="0.005096"/>
</kw>
<status status="PASS" start="2026-04-25T23:41:57.855076" elapsed="0.005356"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.855057" elapsed="0.005400"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:41:57.861382" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.860982" elapsed="0.000427"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:41:57.861458" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:41:57.861609" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:41:57.860669" elapsed="0.000964"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.861790" elapsed="0.000410"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.862462" level="INFO">index=73
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:41:57.862355" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:41:57.862837" elapsed="0.002209"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.865457" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:41:57.866395" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.865197" elapsed="0.001586">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:41:57.875989" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:41:57.876379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:41:57.874777" elapsed="0.001693"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.876882" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.877186" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:41:57.867538" elapsed="0.009792"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:41:57.867042" elapsed="0.010336"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.852052" elapsed="0.025409">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.877797" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:41:57.877872" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.837268" elapsed="0.040708">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:41:57.878081" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:41:57.878125" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.833018" elapsed="0.045130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:41:57.878468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:41:57.878224" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-25T23:41:57.878206" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:41:57.832888" elapsed="0.045683"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:41:57.832711" elapsed="0.045890"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:41:57.830351" elapsed="0.048319"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:41:57.825703" elapsed="0.053027"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:41:57.825267" elapsed="0.053509"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:41:57.822581" elapsed="0.056249"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:41:57.880094" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:41:57.880233" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="40"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:41:57.879877" elapsed="0.000383"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:41:57.880305" elapsed="0.000050"/>
</return>
<msg time="2026-04-25T23:41:57.880476" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="40"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:41:57.879556" elapsed="0.000947"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:41:57.881532" elapsed="0.000312"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.882670" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:41:57.881986" elapsed="0.000748"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:41:57.888939" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="40"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:41:57.882873" elapsed="0.006135"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:41:57.881237" elapsed="0.007830"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.889742" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.889205" elapsed="60.001248">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.890710" elapsed="0.000044"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.880643" elapsed="60.010246">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.890957" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.879270" elapsed="60.011788">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.891326" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.891541" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.891720" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.891887" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.891953" elapsed="0.000015"/>
</return>
<arg>merge-multiple-edit-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.878993" elapsed="60.013064">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:42:57.893762" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:42:57.893349" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.893328" elapsed="0.000522"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:42:57.893989" elapsed="0.000382"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.899054" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:42:57.898588" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:42:57.899302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.899159" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.899140" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.899813" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:42:57.899498" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:42:57.900249" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Multiple_Modules_Merge_Edit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:42:57.899984" elapsed="0.000292"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:42:57.900597" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:42:57.900423" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.901139" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:42:57.900792" elapsed="0.000374"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.901616" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:42:57.901309" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.902243" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:42:57.901799" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.902767" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:42:57.902443" elapsed="0.000408"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:42:57.898297" elapsed="0.004610"/>
</kw>
<status status="PASS" start="2026-04-25T23:42:57.893130" elapsed="0.009828"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:42:57.892380" elapsed="0.010620"/>
</kw>
<doc>Commit the addition of the "test" subelement and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:41:57.822073" elapsed="60.080969">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t34" name="Check_Multiple_Modules_Merge_Edit" line="208">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:42:57.906880" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:42:57.906584" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.908121" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.908012" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.907993" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.914359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.914249" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.914231" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.915447" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:42:57.915043" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.915966" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:42:57.915623" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:42:57.916038" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:42:57.916195" 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-04-25T23:42:57.914676" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.921260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.921151" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.921132" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.922534" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.922428" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.922410" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:42:57.923144" 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-04-25T23:42:57.922779" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.923564" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:42:57.923317" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.924400" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.924129" elapsed="0.001192">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:42:57.925501" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:42:57.925547" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.923754" elapsed="0.001816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.926399" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.926126" elapsed="0.001318">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:42:57.927620" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:42:57.927693" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.925743" elapsed="0.002007"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.928642" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.928039" elapsed="0.000701">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:42:57.927829" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:42:57.927810" elapsed="0.001213">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.929175" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.929393" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:42:57.929263" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:42:57.929245" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.929523" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:42:57.932497" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:42:57.932737" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:42:57.931769" elapsed="0.001064"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.933729" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.934552" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:42:57.930360" elapsed="0.004332"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:42:57.929791" elapsed="0.005028"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.922128" elapsed="0.012777">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</status>
</kw>
<msg time="2026-04-25T23:42:57.935007" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:42:57.935051" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Edit"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.921466" elapsed="0.013609"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.935258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.935151" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.935132" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.936214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:42:57.936102" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.936084" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.936545" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:42:57.936647" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:42:57.936417" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.937088" level="INFO">{1: 73}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:42:57.936830" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:42:57.937514" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:42:57.937270" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:42:57.938067" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:42:57.938481" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:42:57.938526" 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-04-25T23:42:57.937719" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:42:57.939377" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.941458" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.941039" elapsed="0.000979">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.939898" elapsed="0.002197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:42:57.943506" elapsed="0.000497"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.942321" elapsed="0.001746"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:42:57.938878" elapsed="0.005292"/>
</kw>
<status status="PASS" start="2026-04-25T23:42:57.938624" elapsed="0.005598"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.938605" elapsed="0.005643"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:42:57.945177" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:42:57.944764" elapsed="0.000440"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:42:57.945252" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:42:57.945406" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:42:57.944439" elapsed="0.000992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:42:57.945572" elapsed="0.000430"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.946268" level="INFO">index=74
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:42:57.946158" elapsed="0.000244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:42:57.946536" elapsed="0.002446"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.949396" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:42:57.951457" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.949135" elapsed="0.002860">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:42:57.961229" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:42:57.961607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:42:57.959968" elapsed="0.001811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.962106" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.962355" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:42:57.952789" elapsed="0.009725"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:42:57.952257" elapsed="0.010307"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.935810" elapsed="0.026875">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.963138" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:42:57.963214" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.920813" elapsed="0.042507">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:42:57.963426" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:42:57.963470" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.916578" elapsed="0.046915"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:42:57.964051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:42:57.963610" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-25T23:42:57.963591" elapsed="0.000538"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:42:57.916448" elapsed="0.047704"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:42:57.916274" elapsed="0.047908"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:42:57.913883" elapsed="0.050354"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:42:57.907723" elapsed="0.056571"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:42:57.907291" elapsed="0.057048"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:42:57.904282" elapsed="0.060114"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:42:57.965376" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-check-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:42:57.965529" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="41"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:42:57.965155" elapsed="0.000407"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:42:57.965609" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:42:57.965774" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="41"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:42:57.964846" elapsed="0.000956"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.969550" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="41"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:42:57.966521" elapsed="0.003089"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.970562" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:42:57.969799" elapsed="0.000815"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:42:57.979979" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:42:57.970820" elapsed="0.009231"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:42:57.966230" elapsed="0.013878"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:43:57.980806" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.980246" elapsed="60.001255">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:43:57.981640" elapsed="0.000058"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.965942" elapsed="60.015904">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:43:57.981914" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>merge-multiple-edit-check</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.964550" elapsed="60.017468">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;test&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:57.982264" elapsed="0.000026"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;model&gt;Dixi&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:57.982427" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:57.982580" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;year&gt;1928&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:57.982855" elapsed="0.000022"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:43:57.984624" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:57.984222" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:57.983882" elapsed="0.000846"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:57.984867" elapsed="0.000382"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.990007" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:43:57.989516" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:43:57.990265" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:57.990113" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:57.990094" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.990777" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:43:57.990461" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:43:57.991225" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Check_Multiple_Modules_Merge_Edit</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:43:57.990951" elapsed="0.000300"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:43:57.991575" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:43:57.991399" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.992111" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:43:57.991763" elapsed="0.000375"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.992587" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:43:57.992279" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.993218" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:43:57.992771" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:57.993740" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:57.993416" elapsed="0.000372"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:43:57.989221" elapsed="0.004626"/>
</kw>
<status status="PASS" start="2026-04-25T23:43:57.983675" elapsed="0.010222"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:43:57.983239" elapsed="0.010699"/>
</kw>
<doc>Check that the "test" subelement exists and has correct value for "port" subelement.</doc>
<status status="FAIL" start="2026-04-25T23:42:57.903586" elapsed="60.090392">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t35" name="Update_Multiple_Modules_Merge" line="216">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:43:57.997243" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:43:57.996995" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:57.998539" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:57.998430" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:57.998411" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.003050" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:58.002944" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.002926" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:43:58.004090" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:43:58.003706" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:43:58.004558" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:43:58.004264" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:43:58.004627" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:43:58.004807" 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-04-25T23:43:58.003330" elapsed="0.001501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.010115" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:58.010007" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.009989" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.011430" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:58.011323" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.011304" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:43:58.012071" 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-04-25T23:43:58.011631" elapsed="0.000467"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.012502" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:58.012247" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.013350" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.013076" elapsed="0.001207">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:43:58.014464" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:43:58.014509" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.012692" elapsed="0.001841"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.015356" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.015083" elapsed="0.001290">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:43:58.016550" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:43:58.016596" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.014704" elapsed="0.001915"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:43:58.017692" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.016936" elapsed="0.000839">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:43:58.016722" elapsed="0.001151">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:43:58.016702" elapsed="0.001205">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.018057" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.018272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:58.018143" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:43:58.018126" elapsed="0.000276"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.018435" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:58.021306" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:43:58.021528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:58.020613" elapsed="0.001052"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.022448" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.023268" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:43:58.019284" elapsed="0.004097"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:43:58.018707" elapsed="0.004797"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.011022" elapsed="0.012566">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</status>
</kw>
<msg time="2026-04-25T23:43:58.023709" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:43:58.023759" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Update_Multiple_Modules_Merge"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.010361" elapsed="0.013422"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.023968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:58.023860" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.023841" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.025086" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:58.024975" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.024954" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.025427" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:43:58.025542" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:43:58.025295" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:58.025989" level="INFO">{1: 74}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:58.025726" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:58.026415" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:58.026172" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:43:58.026971" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:43:58.027385" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:43:58.027430" 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-04-25T23:43:58.026603" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:58.028248" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.030308" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.029890" elapsed="0.000975">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.028633" elapsed="0.002307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:43:58.032269" elapsed="0.000372"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.031163" elapsed="0.001679"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:43:58.027753" elapsed="0.005190"/>
</kw>
<status status="PASS" start="2026-04-25T23:43:58.027529" elapsed="0.005465"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.027510" elapsed="0.005510"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:43:58.034002" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:43:58.033576" elapsed="0.000453"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:43:58.034077" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:43:58.034229" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:43:58.033212" elapsed="0.001041"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:43:58.034394" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.035089" level="INFO">index=75
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:43:58.034980" 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-04-25T23:43:58.035347" elapsed="0.002086"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.037891" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:43:58.039791" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.037607" elapsed="0.002561">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:58.049778" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:43:58.050158" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:58.048445" elapsed="0.001801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.050560" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.050827" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:43:58.040971" elapsed="0.009997"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:43:58.040429" elapsed="0.010587"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.024411" elapsed="0.026687">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.051428" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:43:58.051500" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.009665" elapsed="0.041939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:43:58.051724" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:43:58.051767" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:58.005198" elapsed="0.046592"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:58.052104" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:58.051866" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:58.051848" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:43:58.005068" elapsed="0.047134"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:43:58.004890" elapsed="0.047342"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:43:58.002572" elapsed="0.049714"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:43:57.998105" elapsed="0.054235"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:57.997686" elapsed="0.054698"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:43:57.995004" elapsed="0.057478"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:43:58.054122" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:43:58.054294" level="INFO">${data} = &lt;rpc message-id="42" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operat...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:43:58.053901" elapsed="0.000422"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:43:58.054369" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:43:58.054517" level="INFO">${request} = &lt;rpc message-id="42" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operat...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:43:58.053578" elapsed="0.000968"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.058549" level="INFO">&lt;rpc message-id="42" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:43:58.055299" elapsed="0.003308"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.061914" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:43:58.058801" elapsed="0.003336"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:43:58.736031" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=set
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:43:58.062582" elapsed="0.673994"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:43:58.054998" elapsed="0.681674"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.468821" level="INFO">_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;merge&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `1930'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:43:59.469456" level="INFO">${reply} = 
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
    ...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:43:58.736850" elapsed="0.732638"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:43:59.469552" elapsed="0.000054"/>
</return>
<msg time="2026-04-25T23:43:59.469775" level="INFO">${reply} = 
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
    ...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:43:58.054703" elapsed="1.415102"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:43:59.469852" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:43:59.470003" level="INFO">${actual} = 
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
    ...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:43:58.053268" elapsed="1.416763"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:43:59.471161" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:43:59.471317" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="42"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:43:59.470923" elapsed="0.000422"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:43:59.471390" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:43:59.471538" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="42"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:43:59.470583" elapsed="0.000982"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:43:59.471608" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:43:59.471772" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="42"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:43:59.470237" elapsed="0.001562"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:43:59.472198" level="INFO">${actual} = 
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
    ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.471945" elapsed="0.000282"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:43:59.472607" level="INFO">${actual} = _command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
      ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:43:59.472371" elapsed="0.000264"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:43:59.473958" level="FAIL">OSError: [Errno 36] File name too long: '_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;merge&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1930\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.472797" elapsed="0.002234">OSError: [Errno 36] File name too long: '_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*...
    [ Message content over the limit has been removed. ]
...4-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1930\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.475124" elapsed="0.000329"/>
</return>
<arg>merge-multiple-update</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:43:58.052985" elapsed="1.422595">OSError: [Errno 36] File name too long: '_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*...
    [ Message content over the limit has been removed. ]
...4-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1930\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:43:59.476948" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:59.476545" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.476524" elapsed="0.000536"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:59.477208" elapsed="0.000331"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.482467" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:43:59.481830" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:43:59.482728" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.482570" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.482551" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.483219" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:43:59.482923" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:43:59.483649" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Update_Multiple_Modules_Merge</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.483388" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:43:59.484013" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:43:59.483838" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.484523" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:43:59.484180" elapsed="0.000370"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.485015" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:43:59.484706" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.485619" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"

OSError: [Errno 36] File name too long: '_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*...
    [ Message content over the limit has been removed. ]
...4-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1930\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:43:59.485185" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.486171" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:59.485862" elapsed="0.000357"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:43:59.481522" elapsed="0.004792"/>
</kw>
<status status="PASS" start="2026-04-25T23:43:59.476326" elapsed="0.010039"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:43:59.475949" elapsed="0.010458"/>
</kw>
<doc>Update the value of the "port" subelement of the "test" subelement and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:43:57.994372" elapsed="1.492077">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"

OSError: [Errno 36] File name too long: '_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*...
    [ Message content over the limit has been removed. ]
...4-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;test&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Bentley Speed Six&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;1930&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `1930\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t36" name="Commit_Multiple_Modules_Merge_Update" line="220">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:43:59.490121" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:43:59.489855" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.491349" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.491240" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.491222" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.496383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.496276" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.496259" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.497423" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:43:59.497041" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.497914" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:43:59.497598" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:43:59.497986" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:43:59.498163" 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-04-25T23:43:59.496676" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.503255" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.503147" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.503129" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.504557" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.504451" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.504433" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:43:59.505138" 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-04-25T23:43:59.504779" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.505563" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:59.505309" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.506421" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.506145" elapsed="0.001163">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:43:59.507488" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:43:59.507533" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.505752" elapsed="0.001804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.508379" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.508111" elapsed="0.001281">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:43:59.509569" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:43:59.509614" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.507727" elapsed="0.001910"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.510570" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.509945" elapsed="0.000704">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:43:59.509738" elapsed="0.001022">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:43:59.509718" elapsed="0.001221">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.511119" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.511336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:59.511207" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:43:59.511190" elapsed="0.000241"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.511464" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:59.514382" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:43:59.514614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:59.513636" elapsed="0.001090"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.515509" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.516439" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:43:59.512304" elapsed="0.004255"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:43:59.511735" elapsed="0.004959"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.504147" elapsed="0.012633">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</status>
</kw>
<msg time="2026-04-25T23:43:59.516882" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:43:59.516926" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Update"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.503495" elapsed="0.013455"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.517167" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.517058" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.517039" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.518147" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:43:59.518017" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.518000" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.518480" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:43:59.518581" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:43:59.518356" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.519013" level="INFO">{1: 75}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:59.518759" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:43:59.519433" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:43:59.519193" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.519975" elapsed="0.000325"/>
</kw>
<msg time="2026-04-25T23:43:59.520398" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:43:59.520445" 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-04-25T23:43:59.519619" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:59.521256" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.523301" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.522879" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.521637" elapsed="0.002296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:43:59.525270" elapsed="0.000363"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.524157" elapsed="0.001669"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:43:59.520766" elapsed="0.005163"/>
</kw>
<status status="PASS" start="2026-04-25T23:43:59.520542" elapsed="0.005438"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.520524" elapsed="0.005482"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:43:59.526958" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.526534" elapsed="0.000451"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:43:59.527032" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:43:59.527182" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:43:59.526222" elapsed="0.000989"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.527356" elapsed="0.000439"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.528059" level="INFO">index=76
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:43:59.527949" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:43:59.528320" elapsed="0.002222"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.530969" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:43:59.532040" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.530707" elapsed="0.001705">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:43:59.541721" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:43:59.542150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:43:59.540458" elapsed="0.001785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.542559" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.543210" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:43:59.533187" elapsed="0.010165"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:43:59.532689" elapsed="0.010713"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.517610" elapsed="0.025876">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.543827" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:43:59.543901" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.502809" elapsed="0.041197">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:43:59.544110" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:43:59.544153" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.498561" elapsed="0.045615"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:43:59.544488" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:43:59.544251" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-25T23:43:59.544233" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:43:59.498430" elapsed="0.046155"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:43:59.498250" elapsed="0.046366"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:43:59.495914" elapsed="0.048772"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:43:59.490953" elapsed="0.053789"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:43:59.490524" elapsed="0.054262"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:43:59.487702" elapsed="0.057136"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:43:59.546100" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:43:59.546253" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="43"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:43:59.545885" elapsed="0.000395"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:43:59.546325" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:43:59.546472" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="43"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:43:59.545569" elapsed="0.000929"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:43:59.547232" elapsed="0.000297"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.548382" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:43:59.547736" elapsed="0.000696"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:43:59.554884" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="43"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:43:59.548568" elapsed="0.006387"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:43:59.546941" elapsed="0.008114"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.555753" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.555199" elapsed="60.001243">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.556543" elapsed="0.000041"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.546636" elapsed="60.010098">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.556803" elapsed="0.000019"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.545278" elapsed="60.011628">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.557170" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.557382" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.557547" elapsed="0.000026"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.557738" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.557803" elapsed="0.000016"/>
</return>
<arg>merge-multiple-update-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.545002" elapsed="60.012903">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:44:59.559567" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:44:59.559179" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.559159" elapsed="0.000506"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:44:59.559807" elapsed="0.000380"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.564964" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:44:59.564514" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:44:59.565209" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.565067" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.565049" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.565796" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:44:59.565402" elapsed="0.000422"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:44:59.566262" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Multiple_Modules_Merge_Update</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:44:59.565970" elapsed="0.000320"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:44:59.566609" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:44:59.566435" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.567145" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:44:59.566797" elapsed="0.000375"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.567620" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:44:59.567313" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.568262" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:44:59.567805" elapsed="0.000581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.568855" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:44:59.568536" elapsed="0.000368"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:44:59.564201" elapsed="0.004758"/>
</kw>
<status status="PASS" start="2026-04-25T23:44:59.558962" elapsed="0.010047"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:44:59.558229" elapsed="0.010823"/>
</kw>
<doc>Commit the update and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:43:59.487100" elapsed="60.081994">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t37" name="Check_Multiple_Modules_Merge_Update" line="224">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:44:59.573531" elapsed="0.001161"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:44:59.572863" elapsed="0.001985"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.577507" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.577202" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.577154" elapsed="0.000542"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.587996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.587884" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.587866" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.589074" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:44:59.588673" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.589544" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:44:59.589249" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:44:59.589613" elapsed="0.000052"/>
</return>
<msg time="2026-04-25T23:44:59.589794" 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-04-25T23:44:59.588296" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.594879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.594771" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.594751" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.596183" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.596076" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.596058" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:44:59.596772" 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-04-25T23:44:59.596385" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.597203" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:44:59.596952" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.598058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.597766" elapsed="0.001271">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:44:59.599219" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:44:59.599264" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.597376" elapsed="0.001911"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.600191" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.599899" elapsed="0.001315">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:44:59.601392" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:44:59.601436" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.599497" elapsed="0.001962"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.602377" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.601776" elapsed="0.000680">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:44:59.601534" elapsed="0.001022">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:44:59.601515" elapsed="0.001237">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.602905" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.603119" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:44:59.602991" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:44:59.602974" elapsed="0.000240"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.603245" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:44:59.606105" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:44:59.606330" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:44:59.605442" elapsed="0.000984"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.607350" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.608221" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:44:59.604113" elapsed="0.004222"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:44:59.603509" elapsed="0.005074"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.595753" elapsed="0.012935">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</status>
</kw>
<msg time="2026-04-25T23:44:59.608793" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:44:59.608836" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Update"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.595085" elapsed="0.013775"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.609045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.608937" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.608918" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.609991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:44:59.609881" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.609863" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.610333" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:44:59.610435" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:44:59.610195" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.610874" level="INFO">{1: 76}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:44:59.610598" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:44:59.611294" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:44:59.611055" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:44:59.611845" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:44:59.612294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:44:59.612340" 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-04-25T23:44:59.611479" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:44:59.613160" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.615193" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.614777" elapsed="0.000958">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.613546" elapsed="0.002274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:44:59.617154" 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-04-25T23:44:59.616044" elapsed="0.001530"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:44:59.612645" elapsed="0.005158"/>
</kw>
<status status="PASS" start="2026-04-25T23:44:59.612438" elapsed="0.005418"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.612420" elapsed="0.005461"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:44:59.618800" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:44:59.618382" elapsed="0.000444"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:44:59.618875" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:44:59.619032" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:44:59.618073" elapsed="0.000984"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:44:59.619198" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.619919" level="INFO">index=77
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:44:59.619808" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:44:59.620180" elapsed="0.002219"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.622830" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:44:59.624645" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.622552" elapsed="0.002479">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:44:59.634442" elapsed="0.000405"/>
</kw>
<msg time="2026-04-25T23:44:59.634913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:44:59.633124" elapsed="0.001878"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.635316" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.635593" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:44:59.625977" elapsed="0.009902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:44:59.625287" elapsed="0.010646"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.609490" elapsed="0.026530">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.636343" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:44:59.636416" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.594423" elapsed="0.042132">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:44:59.636814" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:44:59.636861" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.590191" elapsed="0.046693"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:44:59.637202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:44:59.636963" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-25T23:44:59.636944" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:44:59.590060" elapsed="0.047241"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:44:59.589880" elapsed="0.047452"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:44:59.587502" elapsed="0.049885"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:44:59.576493" elapsed="0.060948"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:44:59.575431" elapsed="0.062056"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:44:59.569963" elapsed="0.067575"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:44:59.638526" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-check-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-update-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:44:59.638718" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="44"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:44:59.638306" elapsed="0.000441"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:44:59.638792" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:44:59.638938" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="44"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:44:59.638002" elapsed="0.000962"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.642691" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="44"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:44:59.639719" elapsed="0.003029"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.643615" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:44:59.642890" elapsed="0.000810"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:44:59.652319" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:44:59.643867" elapsed="0.008522"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:44:59.639393" elapsed="0.013058"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.653171" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.652589" elapsed="60.001262">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.653962" elapsed="0.000036"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.639105" elapsed="60.015022">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.654196" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>merge-multiple-update-check</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.637724" elapsed="60.016576">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;test&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.654626" elapsed="0.000039"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;model&gt;Bentley Speed Six&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.654811" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;manufacturer&gt;Bentley&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.654968" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;year&gt;1930&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.655123" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;model&gt;Dixi&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.655278" elapsed="0.000044"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.655458" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;year&gt;1928&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.655611" elapsed="0.000020"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:45:59.657365" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:45:59.656960" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.656936" elapsed="0.000516"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:45:59.657588" elapsed="0.000400"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.662724" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:45:59.662270" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:45:59.662980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.662830" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.662811" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.663493" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:45:59.663178" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:45:59.663956" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Check_Multiple_Modules_Merge_Update</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.663682" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:45:59.664307" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:45:59.664131" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.664848" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:45:59.664483" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.665332" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:45:59.665021" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.665965" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:45:59.665503" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.666461" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:45:59.666164" elapsed="0.000346"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:45:59.661973" elapsed="0.004592"/>
</kw>
<status status="PASS" start="2026-04-25T23:45:59.656423" elapsed="0.010251"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:45:59.655997" elapsed="0.010723"/>
</kw>
<doc>Check that the value of the "port" was really updated.</doc>
<status status="FAIL" start="2026-04-25T23:44:59.569445" elapsed="60.097316">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t38" name="Replace_Multiple_Modules_Merge" line="235">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:45:59.669997" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:45:59.669746" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.671230" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.671119" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.671101" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.675763" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.675640" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.675623" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.676811" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:45:59.676409" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.677287" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:45:59.676987" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:45:59.677358" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:45:59.677515" 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-04-25T23:45:59.676044" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.682887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.682777" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.682758" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.684192" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.684086" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.684068" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:45:59.684782" level="INFO">${karaf_connection_index} = 77</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.684392" elapsed="0.000417"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.685212" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:45:59.684959" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.686053" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.685783" elapsed="0.001176">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:45:59.687140" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:45:59.687186" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.685388" elapsed="0.001822"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.688052" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.687778" elapsed="0.001298">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:45:59.689254" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:45:59.689300" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.687380" elapsed="0.001944"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.690234" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.689609" elapsed="0.000705">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:45:59.689399" elapsed="0.001043">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:45:59.689379" elapsed="0.001099">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.690628" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.690863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:45:59.690731" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:45:59.690713" elapsed="0.000247"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.690993" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:45:59.693942" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:45:59.694165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:45:59.693212" elapsed="0.001048"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.695051" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.695888" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:45:59.691862" elapsed="0.004143"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:45:59.691245" elapsed="0.004875"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.683784" elapsed="0.012421">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</status>
</kw>
<msg time="2026-04-25T23:45:59.696308" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:45:59.696351" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Replace_Multiple_Modules_Merge"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.683098" elapsed="0.013277"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.696559" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.696452" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.696433" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.697610" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:45:59.697499" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.697479" elapsed="0.000243"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.697993" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:45:59.698098" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:45:59.697866" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.698530" level="INFO">{1: 77}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:45:59.698267" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:45:59.699036" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:45:59.698789" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.699606" elapsed="0.000339"/>
</kw>
<msg time="2026-04-25T23:45:59.700045" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:45:59.700092" level="INFO">${old_connection_index} = 77</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.699230" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:45:59.700928" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.703040" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.702607" elapsed="0.001008">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.701314" elapsed="0.002395"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:45:59.705101" elapsed="0.000359"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.703969" elapsed="0.001555"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:45:59.700401" elapsed="0.005226"/>
</kw>
<status status="PASS" start="2026-04-25T23:45:59.700192" elapsed="0.005512"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.700174" elapsed="0.005557"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:45:59.706644" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.706242" elapsed="0.000444"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:45:59.706735" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:45:59.706888" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:45:59.705926" elapsed="0.000987"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.707055" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.707773" level="INFO">index=78
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:45:59.707642" elapsed="0.000257"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:45:59.708035" elapsed="0.002059"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.710503" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:45:59.712383" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.710245" elapsed="0.002536">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:45:59.722418" elapsed="0.000336"/>
</kw>
<msg time="2026-04-25T23:45:59.722813" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:45:59.721018" elapsed="0.001885"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.723242" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.723523" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:45:59.713544" elapsed="0.010136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:45:59.713043" elapsed="0.010688"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.697034" elapsed="0.026781">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.724137" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:45:59.724210" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.682420" elapsed="0.041893">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:45:59.724419" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:45:59.724463" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.677925" elapsed="0.046562"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:45:59.724831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:45:59.724562" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-25T23:45:59.724544" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:45:59.677792" elapsed="0.047181"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:45:59.677595" elapsed="0.047413"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:45:59.675269" elapsed="0.049795"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:45:59.670832" elapsed="0.054287"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:45:59.670400" elapsed="0.054764"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:45:59.667776" elapsed="0.057441"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:45:59.726692" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:45:59.726961" level="INFO">${data} = &lt;rpc message-id="70" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operat...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:45:59.726458" elapsed="0.000534"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:45:59.727039" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:45:59.727190" level="INFO">${request} = &lt;rpc message-id="70" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operat...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:45:59.726150" elapsed="0.001069"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.730464" level="INFO">&lt;rpc message-id="70" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:45:59.727991" elapsed="0.002530"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.734148" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:45:59.730679" elapsed="0.003702"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:45:59.977084" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=set
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:45:59.734875" elapsed="0.245928"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:45:59.727692" elapsed="0.253224"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.608677" level="INFO">local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;replace&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;REPLACE&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Panda&lt;/model&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;FIAT&lt;/manufacturer&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;2003&lt;/year&gt;
[?2004l-bash: syntax error near unexpected token `2003'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:46:01.609686" level="INFO">${reply} = 

    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPA...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:45:59.981163" elapsed="1.628559"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:46:01.609808" elapsed="0.000064"/>
</return>
<msg time="2026-04-25T23:46:01.610045" level="INFO">${reply} = 

    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPA...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:45:59.727381" elapsed="1.882695"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:46:01.610127" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:46:01.610281" level="INFO">${actual} = 

    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPA...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:45:59.725852" elapsed="1.884458"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:46:01.611580" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:46:01.611768" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="70"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:46:01.611319" elapsed="0.000477"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:46:01.611842" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:46:01.611993" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="70"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:46:01.610954" elapsed="0.001067"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:46:01.612065" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:46:01.612214" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="70"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:46:01.610551" elapsed="0.001690"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:46:01.612696" level="INFO">${actual} = 

    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPA...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.612389" elapsed="0.000337"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:46:01.613120" level="INFO">${actual} = local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
 ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:46:01.612875" elapsed="0.000275"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:46:01.614844" level="FAIL">OSError: [Errno 36] File name too long: 'local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n        else\r\n            if [ -h "$g/HEAD" ]; then\r\n                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";\r\n            else\r\n                local head="";\r\n                if ! __git_eread "$g/HEAD" head; then\r\n                    return $exit;\r\n                fi;\r\n                b="${head#ref: }";\r\n                if [ "$head" = "$b" ]; then\r\n                    detached=yes;\r\n                    b="$(\r\n\t\t\t\tcase "${GIT_PS1_DESCRIBE_STYLE-}" in\r\n\t\t\t\t(contains)\r\n\t\t\t\t\tgit describe --contains HEAD ;;\r\n\t\t\t\t(branch)\r\n\t\t\t\t\tgit describe --contains --all HEAD ;;\r\n\t\t\t\t(tag)\r\n\t\t\t\t\tgit describe --tags HEAD ;;\r\n\t\t\t\t(describe)\r\n\t\t\t\t\tgit describe HEAD ;;\r\n\t\t\t\t(* | default)\r\n\t\t\t\t\tgit describe --tags --exact-match HEAD ;;\r\n\t\t\t\tesac 2&gt;/dev/null)" || b="$short_sha...";\r\n                    b="($b)";\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then\r\n        r="$r $step/$total";\r\n    fi;\r\n    local w="";\r\n    local i="";\r\n    local s="";\r\n    local u="";\r\n    local h="";\r\n    local c="";\r\n    local p="";\r\n    if [ "true" = "$inside_gitdir" ]; then\r\n        if [ "true" = "$bare_repo" ]; then\r\n            c="BARE:";\r\n        else\r\n            b="GIT_DIR!";\r\n        fi;\r\n    else\r\n        if [ "true" = "$inside_worktree" ]; then\r\n            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then\r\n                git diff --no-ext-diff --quiet || w="*";\r\n                git diff --no-ext-diff --cached --quiet || i="+";\r\n                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then\r\n                    i="#";\r\n                fi;\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then\r\n                s="$";\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- \':/*\' &gt; /dev/null 2&gt; /dev/null; then\r\n                u="%${ZSH_VERSION+%}";\r\n            fi;\r\n            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n                h="?";\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then\r\n                __git_ps1_show_upstream;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    local z="${GIT_PS1_STATESEPARATOR-" "}";\r\n    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then\r\n        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then\r\n            __git_ps1_colorize_gitstring;\r\n        fi;\r\n    fi;\r\n    b=${b##refs/heads/};\r\n    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n        __git_ps1_branch_name=$b;\r\n        b="\\${__git_ps1_branch_name}";\r\n    fi;\r\n    local f="$h$w$i$s$u";\r\n    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";\r\n    if [ $pcmode = yes ]; then\r\n        if [ "${__git_printf_supports_v-}" != yes ]; then\r\n            gitstring=$(printf -- "$printf_format" "$gitstring");\r\n        else\r\n            printf -v gitstring -- "$printf_format" "$gitstring";\r\n        fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";\r\n                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then\r\n                    p="";\r\n                    return;\r\n                fi\r\n            ;;\r\n            svn-remote.*.url)\r\n                svn_remote[$((${#svn_remote[@]} + 1))]="$value";\r\n                svn_url_pattern="$svn_url_pattern\\\\|$value";\r\n                upstream=svn+git\r\n            ;;\r\n        esac;\r\n    done &lt;&lt;&lt; "$output";\r\n    local option;\r\n    for option in ${GIT_PS1_SHOWUPSTREAM};\r\n    do\r\n        case "$option" in \r\n            git | svn)\r\n                upstream="$option"\r\n            ;;\r\n            verbose)\r\n                verbose=1\r\n            ;;\r\n            legacy)\r\n                legacy=1\r\n            ;;\r\n            name)\r\n                name=1\r\n            ;;\r\n        esac;\r\n    done;\r\n    case "$upstream" in \r\n        git)\r\n            upstream="@{upstream}"\r\n        ;;\r\n        svn*)\r\n            local -a svn_upstream;\r\n            svn_upstream=($(git log --first-parent -1 \t\t\t\t\t--grep="^git-svn-id: \\(${svn_url_pattern#??}\\)" 2&gt;/dev/null));\r\n            if [[ 0 -ne ${#svn_upstream[@]} ]]; then\r\n                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};\r\n                svn_upstream=${svn_upstream%@*};\r\n                local n_stop="${#svn_remote[@]}";\r\n                for ((n=1; n &lt;= n_stop; n++))\r\n                do\r\n                    svn_upstream=${svn_upstream#${svn_remote[$n]}};\r\n                done;\r\n                if [[ -z "$svn_upstream" ]]; then\r\n                    upstream=${GIT_SVN_ID:-git-svn};\r\n                else\r\n                    upstream=${svn_upstream#/};\r\n                fi;\r\n            else\r\n                if [[ "svn+git" = "$upstream" ]]; then\r\n                    upstream="@{upstream}";\r\n                fi;\r\n            fi\r\n        ;;\r\n    esac;\r\n    if [[ -z "$legacy" ]]; then\r\n        count="$(git rev-list --count --left-right \t\t\t\t"$upstream"...HEAD 2&gt;/dev/null)";\r\n    else\r\n        local commits;\r\n        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then\r\n            local commit behind=0 ahead=0;\r\n            for commit in $commits;\r\n            do\r\n                case "$commit" in \r\n                    "&lt;"*)\r\n                        ((behind++))\r\n                    ;;\r\n                    *)\r\n                        ((ahead++))\r\n                    ;;\r\n                esac;\r\n            done;\r\n            count="$behind\t$ahead";\r\n        else\r\n            count="";\r\n        fi;\r\n    fi;\r\n    if [[ -z "$verbose" ]]; then\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p="="\r\n            ;;\r\n            "0\t"*)\r\n                p="&gt;"\r\n            ;;\r\n            *"\t0")\r\n                p="&lt;"\r\n            ;;\r\n            *)\r\n                p="&lt;&gt;"\r\n            ;;\r\n        esac;\r\n    else\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p=" u="\r\n            ;;\r\n            "0\t"*)\r\n                p=" u+${count#0\t}"\r\n            ;;\r\n            *"\t0")\r\n                p=" u-${count%\t0}"\r\n            ;;\r\n            *)\r\n                p=" u+${count#*\t}-${count%\t*}"\r\n            ;;\r\n        esac;\r\n        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then\r\n            __git_ps1_upstream_name=$(git rev-parse \t\t\t\t--abbrev-ref "$upstream" 2&gt;/dev/null);\r\n            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n                p="$p \\${__git_ps1_upstream_name}";\r\n            else\r\n                p="$p ${__git_ps1_upstream_name}";\r\n                unset __git_ps1_upstream_name;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n__git_sequencer_status () \r\n{ \r\n    local todo;\r\n    if test -f "$g/CHERRY_PICK_HEAD"; then\r\n        r="|CHERRY-PICKING";\r\n        return 0;\r\n    else\r\n        if test -f "$g/REVERT_HEAD"; then\r\n            r="|REVERTING";\r\n            return 0;\r\n        else\r\n            if __git_eread "$g/sequencer/todo" todo; then\r\n                case "$todo" in \r\n                    p[\\ \\\t] | pick[\\ \\\t]*)\r\n                        r="|CHERRY-PICKING";\r\n                        return 0\r\n                    ;;\r\n                    revert[\\ \\\t]*)\r\n                        r="|REVERTING";\r\n                        return 0\r\n                    ;;\r\n                esac;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n__load_completion () \r\n{ \r\n    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);\r\n    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;\r\n    [[ -n $cmd ]] || return 1;\r\n    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};\r\n    do\r\n        dirs+=($dir/bash-completion/completions);\r\n    done;\r\n    IFS=$ifs;\r\n    if [[ $BASH_SOURCE == */* ]]; then\r\n        dirs+=("${BASH_SOURCE%/*}/completions");\r\n    else\r\n        dirs+=(./completions);\r\n    fi;\r\n    local backslash=;\r\n    if [[ $cmd == \\\\* ]]; then\r\n        cmd="${cmd:1}";\r\n        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\\\$cmd" &amp;&amp; return 0;\r\n        backslash=\\\\;\r\n    fi;\r\n    for dir in "${dirs[@]}";\r\n    do\r\n        [[ -d $dir ]] || continue;\r\n        for compfile in "$cmd" "$cmd.bash" "_$cmd";\r\n        do\r\n            compfile="$dir/$compfile";\r\n            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then\r\n                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\\\$cmd";\r\n                return 0;\r\n            fi;\r\n        done;\r\n    done;\r\n    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;\r\n    return 1\r\n}\r\n__ltrim_colon_completions () \r\n{ \r\n    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then\r\n        local colon_word=${1%"${1##*:}"};\r\n        local i=${#COMPREPLY[*]};\r\n        while ((i-- &gt; 0)); do\r\n            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};\r\n        done;\r\n    fi\r\n}\r\n__parse_options () \r\n{ \r\n    local option option2 i IFS=\' \t\r\n,/|\';\r\n    option=;\r\n    local -a array=($1);\r\n    for i in "${array[@]}";\r\n    do\r\n        case "$i" in \r\n            ---*)\r\n                break\r\n            ;;\r\n            --?*)\r\n                option=$i;\r\n                break\r\n            ;;\r\n            -?*)\r\n                [[ -n $option ]] || option=$i\r\n            ;;\r\n            *)\r\n                break\r\n            ;;\r\n        esac;\r\n    done;\r\n    [[ -n $option ]] || return 0;\r\n    IFS=\' \t\r\n\';\r\n    if [[ $option =~ (\\[((no|dont)-?)\\]). ]]; then\r\n        option2=${option/"${BASH_REMATCH[1]}"/};\r\n        option2=${option2%%[&lt;{().[]*};\r\n        printf \'%s\\n\' "${option2/=*/=}";\r\n        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};\r\n    fi;\r\n    option=${option%%[&lt;{().[]*};\r\n    printf \'%s\\n\' "${option/=*/=}"\r\n}\r\n__reassemble_comp_words_by_ref () \r\n{ \r\n    local exclude i j line ref;\r\n    if [[ -n $1 ]]; then\r\n        exclude="[${1//[^$COMP_WORDBREAKS]/}]";\r\n    fi;\r\n    printf -v "$3" %s "$COMP_CWORD";\r\n    if [[ -v exclude ]]; then\r\n        line=$COMP_LINE;\r\n        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))\r\n        do\r\n            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do\r\n                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));\r\n                ref="$2[$j]";\r\n                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n                line=${line#*"${COMP_WORDS[i]}"};\r\n                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));\r\n                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;\r\n            done;\r\n            ref="$2[$j]";\r\n            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n            line=${line#*"${COMP_WORDS[i]}"};\r\n            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n        done;\r\n        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n    else\r\n        for i in "${!COMP_WORDS[@]}";\r\n        do\r\n            printf -v "$2[i]" %s "${COMP_WORDS[i]}";\r\n        done;\r\n    fi\r\n}\r\n_allowed_groups () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -g -- "$1"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));\r\n    fi\r\n}\r\n_allowed_users () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -u -- "${1:-$cur}"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));\r\n    fi\r\n}\r\n_apport-bug () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        ubuntu-bug | apport-bug)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions="--tag";\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-cli () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help -f --file-bug -u --update-bug -s --symptom \\\r\n                 -c --crash-file --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        apport-cli)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        -f | --file-bug)\r\n            param="-P --pid -p --package -s --symptom";\r\n            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        -s | --symptom)\r\n            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -c | --crash-file)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-collect () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-collect)\r\n            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))\r\n        ;;\r\n        -p | --package)\r\n            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))\r\n        ;;\r\n        --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            if [[ "${COMP_WORDS[*]}" =~ .*\\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then\r\n                COMPREPLY=($( compgen -W "--tag" -- $cur));\r\n            else\r\n                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));\r\n            fi\r\n        ;;\r\n    esac\r\n}\r\n_apport-unpack () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-unpack)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n    esac\r\n}\r\n_apport_parameterless () \r\n{ \r\n    local param;\r\n    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";\r\n    COMPREPLY=($( compgen -W "$param" -- $cur))\r\n}\r\n_apport_symptoms () \r\n{ \r\n    local syms;\r\n    if [ -r /usr/share/apport/symptoms ]; then\r\n        for FILE in $(ls /usr/share/apport/symptoms);\r\n        do\r\n            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\\s*\\(.*\\):" /usr/share/apport/symptoms/$FILE) ]]; then\r\n                syms="$syms ${FILE%.py}";\r\n            fi;\r\n        done;\r\n    fi;\r\n    echo $syms\r\n}\r\n_available_interfaces () \r\n{ \r\n    local PATH=$PATH:/sbin;\r\n    COMPREPLY=($({\r\n        if [[ ${1:-} == -w ]]; then\r\n            iwconfig\r\n        elif [[ ${1:-} == -a ]]; then\r\n            ifconfig || ip link show up\r\n        else\r\n            ifconfig -a || ip link show\r\n        fi\r\n    } 2&gt;/dev/null | awk         \'/^[^ \\t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }\'));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]/%[[:punct:]]/}\' -- "$cur"))\r\n}\r\n_bashcomp_try_faketty () \r\n{ \r\n    if type unbuffer &amp;&gt; /dev/null; then\r\n        unbuffer -p "$@";\r\n    else\r\n        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then\r\n            script -qaefc "$*" /dev/null;\r\n        else\r\n            "$@";\r\n        fi;\r\n    fi\r\n}\r\n_cd () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    local IFS=\'\r\n\' i j k;\r\n    compopt -o filenames;\r\n    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then\r\n        _filedir -d;\r\n        return;\r\n    fi;\r\n    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);\r\n    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);\r\n    for i in ${CDPATH//:/\'\r\n\'};\r\n    do\r\n        k="${#COMPREPLY[@]}";\r\n        for j in $(compgen -d -- $i/$cur);\r\n        do\r\n            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then\r\n                j+="/";\r\n            fi;\r\n            COMPREPLY[k++]=${j#$i/};\r\n        done;\r\n    done;\r\n    _filedir -d;\r\n    if ((${#COMPREPLY[@]} == 1)); then\r\n        i=${COMPREPLY[0]};\r\n        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then\r\n            COMPREPLY[0]="${i}/";\r\n        fi;\r\n    fi;\r\n    return\r\n}\r\n_cd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))\r\n}\r\n_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;replace&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;id&gt;REPLACE&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;model&gt;Panda&lt;/model&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;manufacturer&gt;FIAT&lt;/manufacturer&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;year&gt;2003&lt;/year&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `2003\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.613300" elapsed="0.003100">OSError: [Errno 36] File name too long: 'local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n  ...
    [ Message content over the limit has been removed. ]
...r unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.616494" elapsed="0.000383"/>
</return>
<arg>merge-multiple-replace</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.725384" elapsed="1.891623">OSError: [Errno 36] File name too long: 'local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n  ...
    [ Message content over the limit has been removed. ]
...r unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:46:01.618434" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:46:01.618009" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.617965" elapsed="0.000557"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:46:01.618682" elapsed="0.000393"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.624048" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:46:01.623399" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:46:01.624299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.624151" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.624132" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.624810" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:46:01.624493" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:46:01.625245" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Replace_Multiple_Modules_Merge</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.624983" elapsed="0.000288"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:46:01.625590" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:46:01.625418" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.626119" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:46:01.625774" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.626619" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:46:01.626288" elapsed="0.000373"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.627245" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n  ...
    [ Message content over the limit has been removed. ]
...r unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:46:01.626808" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.627782" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:46:01.627467" elapsed="0.000362"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:46:01.623106" elapsed="0.004777"/>
</kw>
<status status="PASS" start="2026-04-25T23:46:01.617765" elapsed="0.010198"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:46:01.617369" elapsed="0.010636"/>
</kw>
<doc>Replace the content of the "test" with another completely different and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:45:59.667157" elapsed="1.960891">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n  ...
    [ Message content over the limit has been removed. ]
...r unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;car-id&gt;REPLACE&lt;/car-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;           &lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/car-person&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t39" name="Commit_Multiple_Modules_Merge_Replace" line="239">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:46:01.631906" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:46:01.631640" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.633139" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.633029" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.633011" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.637805" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.637698" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.637679" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.638861" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:46:01.638461" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.639341" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:46:01.639039" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:46:01.639411" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:46:01.639565" 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-04-25T23:46:01.638085" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.644711" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.644589" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.644570" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.645971" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.645866" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.645848" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:46:01.646599" level="INFO">${karaf_connection_index} = 78</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.646202" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.647045" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:46:01.646793" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.647893" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.647598" elapsed="0.001204">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:46:01.648987" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:46:01.649032" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.647225" elapsed="0.001831"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.649888" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.649594" elapsed="0.001341">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:46:01.651109" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:46:01.651155" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.649214" elapsed="0.001964"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.652085" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.651460" elapsed="0.000704">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:46:01.651253" elapsed="0.001005">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:46:01.651233" elapsed="0.001204">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.652595" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.652828" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:46:01.652698" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:46:01.652679" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.652957" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:46:01.655906" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:46:01.656130" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:46:01.655175" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.657074" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.657996" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:46:01.653806" elapsed="0.004310"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:46:01.653219" elapsed="0.005012"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.645542" elapsed="0.012784">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</status>
</kw>
<msg time="2026-04-25T23:46:01.658431" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:46:01.658475" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Multiple_Modules_Merge_Replace"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.644916" elapsed="0.013582"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.658791" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.658574" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.658555" elapsed="0.000302"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.659624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:46:01.659520" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.659502" elapsed="0.000237"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.660013" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:46:01.660114" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:46:01.659883" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.660534" level="INFO">{1: 78}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:46:01.660279" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:46:01.660978" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:46:01.660734" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.661509" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:46:01.661942" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:46:01.661987" level="INFO">${old_connection_index} = 78</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.661167" 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-04-25T23:46:01.662933" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.664888" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.664453" elapsed="0.000967">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.663318" elapsed="0.002179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:46:01.666975" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.665737" elapsed="0.001654"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:46:01.662295" elapsed="0.005209"/>
</kw>
<status status="PASS" start="2026-04-25T23:46:01.662086" elapsed="0.005470"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.662067" elapsed="0.005514"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:46:01.668508" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.668104" elapsed="0.000431"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:46:01.668584" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:46:01.668751" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:46:01.667793" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:46:01.668920" elapsed="0.000426"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.669613" level="INFO">index=79
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:46:01.669504" 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-04-25T23:46:01.669895" elapsed="0.002224"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.672530" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:46:01.673864" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.672271" elapsed="0.001966">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:46:01.683516" elapsed="0.000432"/>
</kw>
<msg time="2026-04-25T23:46:01.684008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:46:01.682343" elapsed="0.001754"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.684426" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.684724" elapsed="0.000122"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:46:01.675036" elapsed="0.009955"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:46:01.674524" elapsed="0.010515"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.659233" elapsed="0.025889">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.685439" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:46:01.685512" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.644254" elapsed="0.041360">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:46:01.686108" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:46:01.686152" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.639984" elapsed="0.046191"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:46:01.686514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:46:01.686252" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-25T23:46:01.686234" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:46:01.639853" elapsed="0.046760"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:46:01.639665" elapsed="0.046980"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:46:01.637320" elapsed="0.049403"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:46:01.632740" elapsed="0.054038"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:46:01.632306" elapsed="0.054516"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:46:01.629237" elapsed="0.057637"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:46:01.688182" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:46:01.688348" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="71"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:46:01.687953" elapsed="0.000422"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:46:01.688421" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:46:01.688573" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="71"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:46:01.687634" elapsed="0.000965"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:46:01.689343" elapsed="0.000299"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.690467" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:46:01.689808" elapsed="0.000709"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:46:01.696946" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="71"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:46:01.690694" elapsed="0.006320"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:46:01.689051" elapsed="0.008019"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.697748" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.697213" elapsed="60.001158">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.698561" elapsed="0.000038"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.688757" elapsed="60.009985">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.698806" elapsed="0.000016"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.687348" elapsed="60.011559">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.699165" elapsed="0.000031"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.699378" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.699543" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.699724" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.699790" elapsed="0.000016"/>
</return>
<arg>merge-multiple-replace-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.687038" elapsed="60.012858">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:47:01.701602" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:47:01.701175" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.701154" elapsed="0.000559"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:47:01.701854" elapsed="0.000375"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.706936" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:47:01.706492" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:47:01.707194" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.707040" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.707021" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.707702" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:47:01.707388" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:47:01.708143" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Multiple_Modules_Merge_Replace</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.707874" elapsed="0.000295"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:47:01.708490" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:47:01.708317" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.709047" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:47:01.708700" elapsed="0.000374"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.709530" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:47:01.709217" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.710261" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:47:01.709715" elapsed="0.000600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.710779" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:47:01.710459" elapsed="0.000407"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:47:01.706190" elapsed="0.004733"/>
</kw>
<status status="PASS" start="2026-04-25T23:47:01.700955" elapsed="0.010018"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:47:01.700224" elapsed="0.010809"/>
</kw>
<doc>Commit the replace and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:46:01.628620" elapsed="60.082454">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t40" name="Check_Multiple_Modules_Merge_Replace" line="243">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:47:01.714097" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:47:01.713849" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.715338" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.715217" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.715199" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.721595" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.721487" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.721468" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.722644" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:47:01.722258" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.723134" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:47:01.722837" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:47:01.723204" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:47:01.723376" 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-04-25T23:47:01.721893" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.728629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.728509" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.728485" elapsed="0.000229"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.729917" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.729812" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.729793" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:47:01.730474" level="INFO">${karaf_connection_index} = 79</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.730114" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.730913" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:47:01.730645" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.731767" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.731474" elapsed="0.001239">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:47:01.732899" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:47:01.732944" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.731087" elapsed="0.001881"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.733787" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.733498" elapsed="0.001321">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:47:01.734994" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:47:01.735039" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.733122" elapsed="0.001972"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.736040" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.735381" elapsed="0.000739">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:47:01.735172" elapsed="0.001041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:47:01.735152" elapsed="0.001236">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.736543" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.736784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:47:01.736632" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:47:01.736615" elapsed="0.000266"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.736914" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:47:01.739752" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:47:01.739976" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:47:01.739121" 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-04-25T23:47:01.740881" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.741797" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:47:01.737778" elapsed="0.004134"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:47:01.737166" elapsed="0.004860"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.729488" elapsed="0.012624">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</status>
</kw>
<msg time="2026-04-25T23:47:01.742212" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:47:01.742256" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Check_Multiple_Modules_Merge_Replace"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.728853" elapsed="0.013427"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.742461" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.742356" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.742337" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.743306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:47:01.743202" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.743184" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.743678" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:47:01.743783" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:47:01.743508" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.744204" level="INFO">{1: 79}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:47:01.743948" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:47:01.744634" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:47:01.744385" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.745180" elapsed="0.000312"/>
</kw>
<msg time="2026-04-25T23:47:01.745590" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:47:01.745636" level="INFO">${old_connection_index} = 79</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.744838" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:47:01.746451" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.748557" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.748135" elapsed="0.000966">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.746990" elapsed="0.002189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:47:01.750515" elapsed="0.000395"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.749402" elapsed="0.001571"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:47:01.745962" elapsed="0.005112"/>
</kw>
<status status="PASS" start="2026-04-25T23:47:01.745753" elapsed="0.005373"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.745733" elapsed="0.005419"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:47:01.752173" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.751765" elapsed="0.000435"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:47:01.752247" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:47:01.752398" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:47:01.751343" elapsed="0.001080"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.752569" elapsed="0.000430"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.753264" level="INFO">index=80
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:47:01.753154" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:47:01.753527" elapsed="0.002238"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.756183" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:47:01.758087" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.755917" elapsed="0.002541">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:47:01.767810" elapsed="0.000341"/>
</kw>
<msg time="2026-04-25T23:47:01.768208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:47:01.766588" elapsed="0.001710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.768621" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.768890" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:47:01.759404" elapsed="0.009627"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:47:01.758901" elapsed="0.010178"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.742916" elapsed="0.026244">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.769475" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:47:01.769547" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.728150" elapsed="0.041499">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:47:01.769866" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:47:01.769909" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.723803" elapsed="0.046129"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:47:01.770291" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:47:01.770048" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-25T23:47:01.770028" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:47:01.723651" elapsed="0.046739"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:47:01.723457" elapsed="0.046963"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:47:01.721116" elapsed="0.049358"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:47:01.714931" elapsed="0.055598"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:47:01.714497" elapsed="0.056076"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:47:01.711870" elapsed="0.058755"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:47:01.771867" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-check-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:47:01.772049" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="72"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:47:01.771627" elapsed="0.000451"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:47:01.772124" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:47:01.772272" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="72"&gt;
    &lt;get-config&gt;
        &lt;source&gt;
            &lt;running/&gt;
        &lt;/source&gt;
    &lt;/get-config&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:47:01.771327" elapsed="0.000973"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.775432" level="INFO">&lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="72"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:47:01.773054" elapsed="0.002437"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.776974" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:47:01.775633" elapsed="0.001397"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:47:01.785751" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;running/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/source&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/get-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:47:01.777172" elapsed="0.008653"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:47:01.772758" elapsed="0.013124"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.814857" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.786130" elapsed="60.040392">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.827738" elapsed="0.001497"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.772441" elapsed="60.058057">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.830647" elapsed="0.000052"/>
</return>
<var>${reply}</var>
<arg>merge-multiple-replace-check</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.771058" elapsed="60.059774">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;REPLACE&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.833692" elapsed="0.000063"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;manufacturer&gt;FIAT&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.833946" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;model&gt;Panda&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.834109" elapsed="0.001114"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;year&gt;2003&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.835389" elapsed="0.000023"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;REPLACE&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.835551" elapsed="0.000021"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;TOY001&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.836185" elapsed="0.000024"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUST001&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.836431" elapsed="0.000036"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;TOY001&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.836676" elapsed="0.000030"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUST001&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.836895" elapsed="0.000029"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;OLD001&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.837113" elapsed="0.000028"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUST002&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.837330" elapsed="0.000028"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;OLD001&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.837543" elapsed="0.000027"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUST002&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.837776" elapsed="0.000030"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CAROLD&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.837990" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUSTOLD&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.838218" elapsed="0.000029"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;CAROLD&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.838495" elapsed="0.000038"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUSTOLD&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.838790" elapsed="0.000034"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CARYOUNG&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.839015" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUSTYOUNG&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.839275" elapsed="0.000031"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;CARYOUNG&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.839492" elapsed="0.000029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUSTYOUNG&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.839728" elapsed="0.000030"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CARMID&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.839942" elapsed="0.000028"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUSTMID&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.840155" elapsed="0.000028"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;CARMID&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.840387" elapsed="0.000025"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUSTMID&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.840549" elapsed="0.000488"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CAROLD2&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841176" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUSTOLD2&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841329" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;car-id&gt;CAROLD2&lt;/car-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841482" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;person-id&gt;CUSTOLD2&lt;/person-id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841633" elapsed="0.000033"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;CUSTBAD&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841801" elapsed="0.000021"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${reply}</arg>
<arg>&lt;id&gt;test&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.841953" elapsed="0.000980"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:48:01.845575" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:01.845095" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.845066" elapsed="0.000727"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:01.845950" elapsed="0.001426"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.853299" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:01.852338" elapsed="0.000995"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:48:01.853584" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.853422" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.853399" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.854125" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:01.853818" elapsed="0.000335"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:48:01.855050" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Check_Multiple_Modules_Merge_Replace</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:48:01.854303" elapsed="0.000775"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:48:01.855470" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:48:01.855282" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.856488" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:01.856120" elapsed="0.000395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.857005" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:01.856680" elapsed="0.000354"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.858121" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:48:01.857183" elapsed="0.001001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.858664" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:01.858344" elapsed="0.000374"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:48:01.852012" elapsed="0.006774"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:01.844855" elapsed="0.013990"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:48:01.844343" elapsed="0.014551"/>
</kw>
<doc>Check that the new content is there and the old content is gone.</doc>
<status status="FAIL" start="2026-04-25T23:47:01.711320" elapsed="60.147639">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t41" name="Remove_Test_Data" line="278">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:48:01.862530" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:48:01.862273" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.863912" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.863777" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.863753" elapsed="0.000234"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.868838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.868728" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.868709" elapsed="0.000285"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.870010" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:48:01.869598" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.870492" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:48:01.870191" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:48:01.870563" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:48:01.870756" 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-04-25T23:48:01.869226" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.875991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.875881" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.875861" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.877343" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.877234" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.877215" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:01.877955" level="INFO">${karaf_connection_index} = 80</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:01.877549" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.878408" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:01.878137" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.879403" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.879032" elapsed="0.001945">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:01.881169" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:48:01.881216" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.878597" elapsed="0.002643"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.882138" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.881835" elapsed="0.001437">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:01.883460" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:48:01.883506" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.881405" elapsed="0.002125"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.884484" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_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-04-25T23:48:01.883841" elapsed="0.000725">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_Data"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:48:01.883607" elapsed="0.001078">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_Data"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:48:01.883587" elapsed="0.001301">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_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-04-25T23:48:01.885047" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.885265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:01.885137" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:48:01.885120" elapsed="0.000243"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.885402" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:01.888500" elapsed="0.000201"/>
</kw>
<msg time="2026-04-25T23:48:01.888783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:01.887793" elapsed="0.001091"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.889854" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.890683" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:01.886349" elapsed="0.004454"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:01.885752" elapsed="0.005173"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.876927" elapsed="0.014088">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_Data"</status>
</kw>
<msg time="2026-04-25T23:48:01.891118" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:01.891161" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Test_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-04-25T23:48:01.876199" elapsed="0.015014"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.891404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.891295" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.891275" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.892284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:01.892177" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.892159" elapsed="0.000708"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.893575" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:48:01.893700" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:01.893011" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.894149" level="INFO">{1: 80}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:01.893873" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:01.894581" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:01.894336" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:01.895158" elapsed="0.000340"/>
</kw>
<msg time="2026-04-25T23:48:01.895599" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:48:01.895645" level="INFO">${old_connection_index} = 80</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.894787" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:01.896537" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.898846" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.898274" elapsed="0.001247">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.896942" elapsed="0.002660"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:48:01.901252" elapsed="0.000392"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.899851" elapsed="0.001992"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:48:01.896031" elapsed="0.005919"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:01.895814" elapsed="0.006188"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.895792" elapsed="0.006237"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:01.903157" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:01.902685" elapsed="0.000516"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:48:01.903256" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:48:01.903425" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:48:01.902256" elapsed="0.001193"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:48:01.903600" elapsed="0.000491"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.904373" level="INFO">index=81
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:01.904257" 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-04-25T23:48:01.904730" elapsed="0.002545"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.907734" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:48:01.910862" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.907435" elapsed="0.003868">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:01.923258" elapsed="0.000472"/>
</kw>
<msg time="2026-04-25T23:48:01.923815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:01.921141" elapsed="0.002798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.924386" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.924633" elapsed="0.000039"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:01.912171" elapsed="0.012622"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:01.911611" elapsed="0.013231"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.891883" elapsed="0.033047">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.925284" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:01.925359" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.875520" elapsed="0.049951">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:48:01.925587" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:01.925630" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.871212" elapsed="0.054485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:01.926036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:01.925787" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:01.925767" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:48:01.871049" elapsed="0.055088"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:48:01.870852" elapsed="0.055325"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:48:01.868342" elapsed="0.057904"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:48:01.863448" elapsed="0.062861"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:01.862969" elapsed="0.063390"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:48:01.860143" elapsed="0.066277"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:01.927993" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:01.928188" level="INFO">${data} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:01.927754" elapsed="0.000462"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:01.928309" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:48:01.928464" level="INFO">${request} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:01.927427" elapsed="0.001065"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.937197" level="INFO">&lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:01.929291" elapsed="0.008079"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:01.938673" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:01.937696" elapsed="0.001035"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:02.717183" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=set
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:01.938948" elapsed="0.778960"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:48:01.928987" elapsed="0.789058"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.366699" level="INFO">_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:48:03.367426" level="INFO">${reply} = 
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /e...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:02.718316" elapsed="0.649142"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.367551" elapsed="0.000090"/>
</return>
<msg time="2026-04-25T23:48:03.367850" level="INFO">${reply} = 
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /e...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:01.928648" elapsed="1.439233"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.367959" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.368128" level="INFO">${actual} = 
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /e...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:01.927118" elapsed="1.441040"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.370028" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.370247" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.369239" elapsed="0.001037"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.370323" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.370475" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.368863" elapsed="0.001639"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.370546" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:48:03.370714" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.368433" elapsed="0.002308"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:48:03.371157" level="INFO">${actual} = 
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /e...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.370892" elapsed="0.000293"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:48:03.371583" level="INFO">${actual} = _configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:48:03.371337" elapsed="0.000274"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:48:03.372974" level="FAIL">OSError: [Errno 36] File name too long: '_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.371781" elapsed="0.003202">OSError: [Errno 36] File name too long: '_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n     ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.375078" elapsed="0.000018"/>
</return>
<arg>merge-multiple-remove</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.926627" elapsed="1.448595">OSError: [Errno 36] File name too long: '_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n     ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:48:03.376724" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.376290" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.376267" elapsed="0.000545"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.376962" elapsed="0.000386"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.382815" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:03.382128" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:48:03.383066" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.382918" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.382899" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.383603" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:03.383277" elapsed="0.000353"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:48:03.384098" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Remove_Test_Data</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.383793" elapsed="0.000332"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:48:03.384448" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.384273" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.384979" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.384615" elapsed="0.000391"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.385460" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.385150" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.386086" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"

OSError: [Errno 36] File name too long: '_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n     ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.385631" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.386611" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.386315" elapsed="0.000358"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.381831" elapsed="0.004898"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:03.376063" elapsed="0.010749"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:48:03.375625" elapsed="0.011229"/>
</kw>
<doc>Remove the testing elements and all their subelements and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:48:01.859506" elapsed="1.527394">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"

OSError: [Errno 36] File name too long: '_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n     ...
    [ Message content over the limit has been removed. ]
...-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;car-people xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car-people" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/car-people&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t42" name="Commit_Test_Data_Removal" line="282">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:48:03.390462" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:48:03.390211" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.391724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.391587" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.391568" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.396325" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.396200" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.396183" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.397480" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:48:03.397096" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.397966" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:48:03.397670" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:48:03.398037" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.398193" 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-04-25T23:48:03.396630" elapsed="0.001588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.403407" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.403242" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.403223" 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-04-25T23:48:03.404768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.404633" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.404615" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.405387" 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-04-25T23:48:03.404973" elapsed="0.000440"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.405847" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.405563" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.406716" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.406405" elapsed="0.001420">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.408038" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:48:03.408085" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.406023" elapsed="0.002086"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.408970" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.408676" elapsed="0.001381">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.410237" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:48:03.410283" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.408267" elapsed="0.002040"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.411237" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.410595" elapsed="0.000722">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:48:03.410383" elapsed="0.001028">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:48:03.410364" elapsed="0.001081">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.411592" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.411822" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.411692" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:48:03.411674" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.411948" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.414955" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:48:03.415180" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.414281" elapsed="0.000995"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.416124" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.416954" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.412868" elapsed="0.004201"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.412235" elapsed="0.004949"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.404330" elapsed="0.012939">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</status>
</kw>
<msg time="2026-04-25T23:48:03.417371" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.417414" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Test_Data_Removal"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.403617" elapsed="0.013821"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.417620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.417513" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.417494" elapsed="0.000296"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.418583" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.418478" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.418460" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.418984" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:48:03.419089" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.418839" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.419520" level="INFO">{1: 81}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.419260" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.419976" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.419718" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.420513" elapsed="0.000371"/>
</kw>
<msg time="2026-04-25T23:48:03.420983" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:48:03.421029" level="INFO">${old_connection_index} = 81</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.420169" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.422042" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.424216" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.423615" elapsed="0.001153">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.422435" elapsed="0.002412"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.426303" elapsed="0.000376"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.425082" elapsed="0.001663"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:48:03.421421" elapsed="0.005424"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:03.421142" elapsed="0.005755"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.421120" elapsed="0.005802"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.427844" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.427428" elapsed="0.000443"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:48:03.427919" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.428270" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.427118" elapsed="0.001176"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.428441" elapsed="0.000459"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.429172" level="INFO">index=82
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.429061" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.429434" elapsed="0.002081"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.431946" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:48:03.433344" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.431681" elapsed="0.002179">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.443128" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:48:03.443503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.441904" elapsed="0.001686"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.444133" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.444381" elapsed="0.000053"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.434636" elapsed="0.009922"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.434125" elapsed="0.010482"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.418188" elapsed="0.026521">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.445031" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.445104" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.402907" elapsed="0.042299">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:48:03.445310" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.445353" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.398601" elapsed="0.046774"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.445706" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.445452" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.445434" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:48:03.398471" elapsed="0.047335"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:48:03.398284" elapsed="0.047556"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:48:03.395832" elapsed="0.050064"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:48:03.391301" elapsed="0.054651"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.390884" elapsed="0.055118"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:48:03.387984" elapsed="0.058071"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.447367" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.447541" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.447138" elapsed="0.000429"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.447611" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.448001" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.446830" elapsed="0.001199"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.448985" elapsed="0.000402"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.450264" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.449539" elapsed="0.000787"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.454925" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:03.450490" elapsed="0.004501"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:48:03.448484" elapsed="0.006569"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.458246" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:48:03.458358" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syn...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:03.455195" elapsed="0.003198"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.458492" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.458646" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syn...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:03.448177" elapsed="0.010516"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.458738" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:48:03.458881" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syn...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:03.446524" elapsed="0.012386"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.459866" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.460191" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.459640" elapsed="0.000581"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.460278" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:48:03.460454" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.459339" elapsed="0.001142"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.460524" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:48:03.460692" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.459049" elapsed="0.001672"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:48:03.461067" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syn...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.460865" elapsed="0.000233"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:48:03.461481" level="INFO">${actual} = [?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: synta...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:48:03.461246" elapsed="0.000265"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:48:03.462094" level="FAIL">FileNotFoundError: [Errno 2] No such file or directory: "\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.461676" elapsed="0.000640">FileNotFoundError: [Errno 2] No such file or directory: "\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.462398" elapsed="0.000021"/>
</return>
<arg>merge-multiple-remove-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.446236" elapsed="0.016276">FileNotFoundError: [Errno 2] No such file or directory: "\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:48:03.463783" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.463394" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.463377" elapsed="0.000492"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.464025" elapsed="0.000324"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.471190" level="INFO">${test_skipped} = None</msg>
<msg time="2026-04-25T23:48:03.471234" level="FAIL">Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</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="FAIL" start="2026-04-25T23:48:03.470732" elapsed="0.000630">Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</status>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:48:03.471600" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.471455" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.471436" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.472132" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:03.471812" elapsed="0.000346"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:48:03.472561" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Commit_Test_Data_Removal</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.472302" elapsed="0.000285"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:48:03.472922" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.472748" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.473431" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.473086" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.473921" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.473598" elapsed="0.000349"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.474522" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal&amp;order=bug_status"

FileNotFoundError: [Errno 2] No such file or directory: "\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.474087" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.475023" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.474732" elapsed="0.000337"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
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="FAIL" start="2026-04-25T23:48:03.470422" elapsed="0.004754">Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</status>
</kw>
<status status="FAIL" start="2026-04-25T23:48:03.463181" elapsed="0.012105">Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</status>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.462825" elapsed="0.012559">Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</status>
</kw>
<doc>Commit the removal and check the reply.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.387438" elapsed="0.088044">FileNotFoundError: [Errno 2] No such file or directory: "\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"

Also teardown failed:
Evaluating expression 'len(re.findall(\'SKIPPED\', """FileNotFoundError: [Errno 2] No such file or directory: "\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\\r\\n\\x1b[?2004l\\r-bash: syntax error near unexpected token `newline\'\\r\\n\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \\r\\n\\x1b[?2004l\\r\\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;"""")) &gt; 0' failed: SyntaxError: unterminated string literal (detected at line 1) (&lt;string&gt;, line 1)</status>
</test>
<test id="s1-s3-s1-t43" name="Connector_Simplified_Pattern" line="286">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:48:03.478700" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:48:03.478437" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.479910" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.479801" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.479782" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.484433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.484326" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.484309" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.485514" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:48:03.485097" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.486008" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:48:03.485704" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:48:03.486078" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.486233" 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-04-25T23:48:03.484737" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.555832" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.555637" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.555604" elapsed="0.000338"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.557463" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.557356" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.557338" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.558106" level="INFO">${karaf_connection_index} = 82</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.557688" elapsed="0.000449"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.558543" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.558290" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.559471" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.559127" elapsed="0.001466">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.560805" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:48:03.560850" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.558750" elapsed="0.002124"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.561708" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.561407" elapsed="0.001453">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.563039" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:48:03.563084" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.561030" elapsed="0.002077"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.564073" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.563389" elapsed="0.000853">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:48:03.563182" elapsed="0.001163">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:48:03.563162" elapsed="0.001218">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.564530" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.564755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.564614" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:48:03.564597" elapsed="0.000254"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.564883" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.568139" elapsed="0.000158"/>
</kw>
<msg time="2026-04-25T23:48:03.568379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.567241" elapsed="0.001235"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.569261" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.570076" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.565737" elapsed="0.004454"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.565145" elapsed="0.005170"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.557054" elapsed="0.013348">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</status>
</kw>
<msg time="2026-04-25T23:48:03.570502" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.570545" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Connector_Simplified_Pattern"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.556176" elapsed="0.014393"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.570779" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.570643" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.570625" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.571613" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.571510" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.571492" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.571991" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:48:03.572113" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.571860" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.572549" level="INFO">{1: 82}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.572283" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.573046" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.572801" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.573577" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:48:03.574007" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:48:03.574052" level="INFO">${old_connection_index} = 82</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.573231" 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-04-25T23:48:03.574870" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.577050" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.576563" elapsed="0.001034">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.575253" elapsed="0.002468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.579088" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.577949" elapsed="0.001566"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:48:03.574354" elapsed="0.005262"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:03.574148" elapsed="0.005543"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.574130" elapsed="0.005588"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.580628" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.580229" elapsed="0.000440"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:48:03.580723" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.580875" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.579911" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.581039" elapsed="0.000434"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.581751" level="INFO">index=83
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.581627" elapsed="0.000255"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.582022" elapsed="0.002342"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.584795" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:48:03.585950" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.584515" elapsed="0.001814">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.595566" elapsed="0.000566"/>
</kw>
<msg time="2026-04-25T23:48:03.596190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.594318" elapsed="0.001960"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.596591" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.596860" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.587123" elapsed="0.009875"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.586588" elapsed="0.010458"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.571219" elapsed="0.025908">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.597449" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.597521" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.555068" elapsed="0.042556">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:48:03.597748" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.597791" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.486629" elapsed="0.111185"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.598132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.597892" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.597873" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:48:03.486500" elapsed="0.111770"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:48:03.486320" elapsed="0.111989"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:48:03.483954" elapsed="0.114417"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:48:03.479500" elapsed="0.118929"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.479096" elapsed="0.119378"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:48:03.476445" elapsed="0.122082"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.600030" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/none-replace-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/none-replace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.600249" level="INFO">${data} = &lt;rpc message-id="m-1" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;edit-config&gt;
        &lt;target&gt;
            &lt;candidate/&gt;
        &lt;/target&gt;
        &lt;default-operation&gt;none&lt;/default-ope...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.599628" elapsed="0.000649"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.600322" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.600471" level="INFO">${request} = &lt;rpc message-id="m-1" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;edit-config&gt;
        &lt;target&gt;
            &lt;candidate/&gt;
        &lt;/target&gt;
        &lt;default-operation&gt;none&lt;/default-ope...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.599321" elapsed="0.001178"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.601244" elapsed="0.000398"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.602442" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.601801" elapsed="0.000691"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.612980" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc message-id="m-1" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:03.602629" elapsed="0.010426"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:48:03.600952" elapsed="0.012164"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.632776" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"
[?2004l-bash: cars: No such file or directory
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:48:03.632903" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-op...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:03.613259" elapsed="0.019674"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.632982" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.633135" level="INFO">${reply} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-op...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:03.600642" elapsed="0.032522"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.633242" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:48:03.633395" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-op...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:48:03.599032" elapsed="0.034393"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.634592" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/none-replace-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/none-replace-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.635352" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" a="64" message-id="m-1"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.634376" elapsed="0.001006"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.635427" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:48:03.635577" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" a="64" message-id="m-1"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.633879" elapsed="0.001726"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:48:03.635648" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:48:03.635810" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" a="64" message-id="m-1"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.633565" elapsed="0.002271"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:48:03.636202" level="INFO">${actual} = 
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-op...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.635980" elapsed="0.000253"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:48:03.636617" level="INFO">${actual} = [?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-oper...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:48:03.636382" elapsed="0.000264"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:48:03.637268" level="FAIL">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"\r\n\x1b[?2004l\r-bash: cars: No such file or directory\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.636809" elapsed="0.000714">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"\r\n\x1b[?2004l\r-bash: cars: No such file or directory\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.637629" elapsed="0.000018"/>
</return>
<arg>none-replace</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.598752" elapsed="0.039003">FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"\r\n\x1b[?2004l\r-bash: cars: No such file or directory\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Perform_Test">
<arg>commit-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.637939" elapsed="0.000033"/>
</kw>
<kw name="Perform_Test">
<arg>delete</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.638119" elapsed="0.000021"/>
</kw>
<kw name="Perform_Test">
<arg>commit-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.638281" elapsed="0.000020"/>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:48:03.639584" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.639206" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.639188" elapsed="0.000500"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.639822" elapsed="0.000326"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.644849" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:03.644396" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:48:03.645092" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.644950" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.644932" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.645619" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:48:03.645325" elapsed="0.000320"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:48:03.646070" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Connector_Simplified_Pattern</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.645811" elapsed="0.000285"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:48:03.646414" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.646242" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.646938" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.646581" elapsed="0.000384"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.647414" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:48:03.647108" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.648035" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"

FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"\r\n\x1b[?2004l\r-bash: cars: No such file or directory\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:48:03.647583" elapsed="0.000570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.648594" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.648298" elapsed="0.000344"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.644107" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:03.639000" elapsed="0.009765"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:48:03.638624" elapsed="0.010182"/>
</kw>
<doc>Several requests in a (simplified) pattern typical for requests from netconf-connector.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.475842" elapsed="0.173005">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"

FileNotFoundError: [Errno 2] No such file or directory: '\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"\r\n\x1b[?2004l\r-bash: cars: No such file or directory\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                     &lt;id&gt;connector&lt;/id&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;                 &lt;/car-entry&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t44" name="Test_Bug_7791" line="293">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:48:03.652308" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:48:03.652029" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.653558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.653448" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.653430" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.658386" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.658278" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.658259" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.659436" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:48:03.659056" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.659922" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:48:03.659611" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:48:03.659992" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.660170" 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-04-25T23:48:03.658692" elapsed="0.001503"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.665350" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.665237" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.665218" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.666634" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.666492" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.666474" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.667251" level="INFO">${karaf_connection_index} = 83</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.666871" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.667720" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.667437" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.668750" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.668327" elapsed="0.001307">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.669832" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:48:03.669878" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.667915" elapsed="0.001985"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.670742" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.670437" elapsed="0.001351">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:48:03.671964" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:48:03.672009" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.670056" elapsed="0.001976"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.672944" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.672326" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:48:03.672119" elapsed="0.000998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:48:03.672099" elapsed="0.001052">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.673300" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.673512" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.673384" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:48:03.673367" elapsed="0.000240"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.673639" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.676580" elapsed="0.000173"/>
</kw>
<msg time="2026-04-25T23:48:03.676826" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.675906" elapsed="0.001015"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.677709" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.678506" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.674475" elapsed="0.004144"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.673908" elapsed="0.004858"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.666194" elapsed="0.012659">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</status>
</kw>
<msg time="2026-04-25T23:48:03.678955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.678998" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Test_Bug_7791"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.665557" elapsed="0.013464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.679204" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.679098" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.679078" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.680169" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:48:03.680046" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.680026" elapsed="0.000244"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.680530" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:48:03.680633" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.680409" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.681073" level="INFO">{1: 83}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.680817" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:48:03.681495" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:48:03.681255" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.682048" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:48:03.682472" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:48:03.682526" level="INFO">${old_connection_index} = 83</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.681704" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.683372" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.685706" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.685112" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.683944" elapsed="0.002383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.687707" 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-04-25T23:48:03.686551" elapsed="0.001589"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:48:03.682874" elapsed="0.005367"/>
</kw>
<status status="PASS" start="2026-04-25T23:48:03.682629" elapsed="0.005662"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.682611" elapsed="0.005706"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:48:03.689243" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.688840" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:48:03.689317" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:48:03.689468" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.688514" elapsed="0.000978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.689637" elapsed="0.000446"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.690357" level="INFO">index=84
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:48:03.690240" elapsed="0.000243"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:48:03.690626" elapsed="0.002261"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.693308" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:48:03.694325" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.693039" elapsed="0.001796">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:48:03.704212" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:48:03.704595" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:48:03.702932" elapsed="0.001801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.705088" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.705343" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:48:03.695610" elapsed="0.009875"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:48:03.695100" elapsed="0.010435"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.679650" elapsed="0.025968">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.706119" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:48:03.706195" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.664903" elapsed="0.041398">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:48:03.706407" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:48:03.706450" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.660569" elapsed="0.045903"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:48:03.706825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:48:03.706549" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-25T23:48:03.706531" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:48:03.660438" elapsed="0.046487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:48:03.660256" elapsed="0.046702"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:48:03.657920" elapsed="0.049095"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:48:03.653161" elapsed="0.053909"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:48:03.652738" elapsed="0.054378"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:48:03.649856" elapsed="0.057312"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:48:03.708699" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/bug7791-1-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/bug7791-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:48:03.709347" level="INFO">${data} = &lt;rpc message-id="m-2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;edit-config&gt;
        &lt;target&gt;
            &lt;candidate/&gt;
        &lt;/target&gt;
        &lt;default-operation&gt;none&lt;/default-ope...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:48:03.708463" elapsed="0.000915"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:48:03.709423" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:48:03.709576" level="INFO">${request} = &lt;rpc message-id="m-2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;edit-config&gt;
        &lt;target&gt;
            &lt;candidate/&gt;
        &lt;/target&gt;
        &lt;default-operation&gt;none&lt;/default-ope...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:48:03.708147" elapsed="0.001458"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.710587" elapsed="0.000400"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.711920" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:48:03.711139" elapsed="0.000919"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:48:03.734937" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc message-id="m-2" a="64" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0" a:operation="replace"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;             &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:48:03.712277" elapsed="0.022804"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:48:03.710291" elapsed="0.024854"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.737533" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.735292" elapsed="60.002945">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.738347" elapsed="0.000584"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.709779" elapsed="60.029304">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.739148" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.707631" elapsed="60.031618">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.739530" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.739774" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.739941" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.740102" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.740167" elapsed="0.000017"/>
</return>
<arg>bug7791-1</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:48:03.707349" elapsed="60.032921">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Perform_Test">
<arg>bug7791-2</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.740445" elapsed="0.000022"/>
</kw>
<kw name="Perform_Test">
<arg>commit-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.740624" elapsed="0.000021"/>
</kw>
<kw name="Perform_Test">
<arg>delete</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.740808" elapsed="0.000021"/>
</kw>
<kw name="Perform_Test">
<arg>commit-edit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.740973" elapsed="0.000021"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.742414" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:49:03.741891" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:49:03.742691" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.742527" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.742505" elapsed="0.000251"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:49:03.742942" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.744110" level="FAIL">'7791' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.743730" elapsed="0.000441">'7791' does not contain '-'</status>
</kw>
<msg time="2026-04-25T23:49:03.744266" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:49:03.743359" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.744887" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=7791</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:49:03.744455" elapsed="0.000468"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.745374" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:49:03.745077" elapsed="0.000323"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.745868" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:49:03.745543" elapsed="0.000352"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.746548" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:49:03.746067" elapsed="0.000549"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.747720" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:49:03.747452" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.748413" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=7791'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-25T23:49:03.748067" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-04-25T23:49:03.747836" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.747818" elapsed="0.000701"/>
</if>
<arg>7791</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:49:03.741465" elapsed="0.007099"/>
</kw>
<doc>Send (checking replies) series of netconf messages to trigger
https://bugs.opendaylight.org/show_bug.cgi?id=7791</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=7791</tag>
<status status="FAIL" start="2026-04-25T23:48:03.649229" elapsed="60.099385">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t45" name="Delete_Not_Existing_Element" line="303">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:49:03.753614" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:49:03.753360" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.754889" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.754774" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.754754" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.759595" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.759488" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.759470" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.760692" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:49:03.760285" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.761165" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:49:03.760870" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:49:03.761235" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:49:03.761402" 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-04-25T23:49:03.759900" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.766534" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.766424" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.766404" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.767871" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.767764" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.767746" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:49:03.768437" level="INFO">${karaf_connection_index} = 84</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:49:03.768070" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.768883" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:03.768610" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.769861" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.769432" elapsed="0.001430">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:49:03.771059" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:49:03.771106" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.769057" elapsed="0.002073"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.771974" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.771690" elapsed="0.001331">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:49:03.773199" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:49:03.773296" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.771288" elapsed="0.002034"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.774250" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.773612" elapsed="0.000719">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:49:03.773400" elapsed="0.001029">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:49:03.773380" elapsed="0.001085">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.774615" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.774851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:49:03.774720" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:49:03.774703" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.775010" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:03.778082" elapsed="0.000159"/>
</kw>
<msg time="2026-04-25T23:49:03.778320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:49:03.777268" elapsed="0.001151"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.779248" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.780273" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:49:03.775880" elapsed="0.004521"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:49:03.775274" elapsed="0.005245"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.767435" elapsed="0.013175">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</status>
</kw>
<msg time="2026-04-25T23:49:03.780768" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:49:03.780813" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Delete_Not_Existing_Element"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.766760" elapsed="0.014076"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.781024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.780915" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.780895" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.781958" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:03.781853" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.781833" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.782314" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:49:03.782419" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:49:03.782166" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.782865" level="INFO">{1: 84}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:49:03.782585" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:03.783318" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:49:03.783075" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:49:03.784047" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:49:03.784476" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:49:03.784522" level="INFO">${old_connection_index} = 84</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.783505" elapsed="0.001039"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:03.785506" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.787702" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.787087" elapsed="0.001182">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.785912" elapsed="0.002434"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:49:03.789823" 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-04-25T23:49:03.788571" elapsed="0.001672"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:49:03.784964" elapsed="0.005382"/>
</kw>
<status status="PASS" start="2026-04-25T23:49:03.784619" elapsed="0.005779"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.784601" elapsed="0.005823"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:49:03.791364" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:49:03.790946" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:49:03.791439" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:49:03.791592" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:49:03.790618" elapsed="0.000998"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:49:03.791775" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.792462" level="INFO">index=85
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:49:03.792351" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:49:03.792752" elapsed="0.002064"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.795278" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:49:03.797511" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.794967" elapsed="0.002932">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:03.809233" elapsed="0.000488"/>
</kw>
<msg time="2026-04-25T23:49:03.809990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:49:03.807099" elapsed="0.003046"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.810616" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.811049" 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-04-25T23:49:03.798679" elapsed="0.012581"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:49:03.798163" elapsed="0.013165"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.781472" elapsed="0.029947">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.811819" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:49:03.811897" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.766087" elapsed="0.045920">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:49:03.812119" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:49:03.812164" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.761816" elapsed="0.050418"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:03.812613" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:49:03.812324" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:03.812300" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:49:03.761684" elapsed="0.051310"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:49:03.761488" elapsed="0.051542"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:49:03.759126" elapsed="0.053964"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:49:03.754464" elapsed="0.058685"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:03.754040" elapsed="0.059157"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:49:03.750500" elapsed="0.062754"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:49:03.814563" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-not-existing-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-not-existing-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:49:03.814766" level="INFO">${data} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:49:03.814338" elapsed="0.000458"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:49:03.814842" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:49:03.815001" level="INFO">${request} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:49:03.814034" elapsed="0.000997"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.819022" level="INFO">&lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:49:03.816002" elapsed="0.003079"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:03.819975" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:49:03.819224" elapsed="0.000805"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:49:04.096440" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
xmlns=urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;
    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:49:03.820198" elapsed="0.276590"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:49:03.815704" elapsed="0.281150"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.416524" level="INFO">fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:49:05.417558" level="INFO">${reply} = 
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:49:04.097006" elapsed="1.320587"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:49:05.417701" elapsed="0.000073"/>
</return>
<msg time="2026-04-25T23:49:05.417957" level="INFO">${reply} = 
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:49:03.815172" elapsed="1.602815"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:49:05.418039" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:49:05.418193" level="INFO">${actual} = 
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:49:03.813743" elapsed="1.604486"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:49:05.419487" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-not-existing-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/delete-not-existing-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:49:05.419682" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;rpc-error&gt;
&lt;error-type&gt;protocol&lt;/error-type&gt;
&lt;error-tag&gt;data-missing&lt;...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:49:05.419227" elapsed="0.000488"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:49:05.419763" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:49:05.419953" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;rpc-error&gt;
&lt;error-type&gt;protocol&lt;/error-type&gt;
&lt;error-tag&gt;data-missing&lt;...</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:49:05.418866" elapsed="0.001117"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:49:05.420030" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:49:05.420188" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;rpc-error&gt;
&lt;error-type&gt;protocol&lt;/error-type&gt;
&lt;error-tag&gt;data-missing&lt;...</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:49:05.418465" elapsed="0.001751"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:49:05.420765" level="INFO">${actual} = 
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.420374" elapsed="0.000426"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:49:05.421201" level="INFO">${actual} = fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:49:05.420955" elapsed="0.000276"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:49:05.422809" level="FAIL">OSError: [Errno 36] File name too long: 'fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";\r\n                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then\r\n                    p="";\r\n                    return;\r\n                fi\r\n            ;;\r\n            svn-remote.*.url)\r\n                svn_remote[$((${#svn_remote[@]} + 1))]="$value";\r\n                svn_url_pattern="$svn_url_pattern\\\\|$value";\r\n                upstream=svn+git\r\n            ;;\r\n        esac;\r\n    done &lt;&lt;&lt; "$output";\r\n    local option;\r\n    for option in ${GIT_PS1_SHOWUPSTREAM};\r\n    do\r\n        case "$option" in \r\n            git | svn)\r\n                upstream="$option"\r\n            ;;\r\n            verbose)\r\n                verbose=1\r\n            ;;\r\n            legacy)\r\n                legacy=1\r\n            ;;\r\n            name)\r\n                name=1\r\n            ;;\r\n        esac;\r\n    done;\r\n    case "$upstream" in \r\n        git)\r\n            upstream="@{upstream}"\r\n        ;;\r\n        svn*)\r\n            local -a svn_upstream;\r\n            svn_upstream=($(git log --first-parent -1 \t\t\t\t\t--grep="^git-svn-id: \\(${svn_url_pattern#??}\\)" 2&gt;/dev/null));\r\n            if [[ 0 -ne ${#svn_upstream[@]} ]]; then\r\n                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};\r\n                svn_upstream=${svn_upstream%@*};\r\n                local n_stop="${#svn_remote[@]}";\r\n                for ((n=1; n &lt;= n_stop; n++))\r\n                do\r\n                    svn_upstream=${svn_upstream#${svn_remote[$n]}};\r\n                done;\r\n                if [[ -z "$svn_upstream" ]]; then\r\n                    upstream=${GIT_SVN_ID:-git-svn};\r\n                else\r\n                    upstream=${svn_upstream#/};\r\n                fi;\r\n            else\r\n                if [[ "svn+git" = "$upstream" ]]; then\r\n                    upstream="@{upstream}";\r\n                fi;\r\n            fi\r\n        ;;\r\n    esac;\r\n    if [[ -z "$legacy" ]]; then\r\n        count="$(git rev-list --count --left-right \t\t\t\t"$upstream"...HEAD 2&gt;/dev/null)";\r\n    else\r\n        local commits;\r\n        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then\r\n            local commit behind=0 ahead=0;\r\n            for commit in $commits;\r\n            do\r\n                case "$commit" in \r\n                    "&lt;"*)\r\n                        ((behind++))\r\n                    ;;\r\n                    *)\r\n                        ((ahead++))\r\n                    ;;\r\n                esac;\r\n            done;\r\n            count="$behind\t$ahead";\r\n        else\r\n            count="";\r\n        fi;\r\n    fi;\r\n    if [[ -z "$verbose" ]]; then\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p="="\r\n            ;;\r\n            "0\t"*)\r\n                p="&gt;"\r\n            ;;\r\n            *"\t0")\r\n                p="&lt;"\r\n            ;;\r\n            *)\r\n                p="&lt;&gt;"\r\n            ;;\r\n        esac;\r\n    else\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p=" u="\r\n            ;;\r\n            "0\t"*)\r\n                p=" u+${count#0\t}"\r\n            ;;\r\n            *"\t0")\r\n                p=" u-${count%\t0}"\r\n            ;;\r\n            *)\r\n                p=" u+${count#*\t}-${count%\t*}"\r\n            ;;\r\n        esac;\r\n        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then\r\n            __git_ps1_upstream_name=$(git rev-parse \t\t\t\t--abbrev-ref "$upstream" 2&gt;/dev/null);\r\n            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n                p="$p \\${__git_ps1_upstream_name}";\r\n            else\r\n                p="$p ${__git_ps1_upstream_name}";\r\n                unset __git_ps1_upstream_name;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n__git_sequencer_status () \r\n{ \r\n    local todo;\r\n    if test -f "$g/CHERRY_PICK_HEAD"; then\r\n        r="|CHERRY-PICKING";\r\n        return 0;\r\n    else\r\n        if test -f "$g/REVERT_HEAD"; then\r\n            r="|REVERTING";\r\n            return 0;\r\n        else\r\n            if __git_eread "$g/sequencer/todo" todo; then\r\n                case "$todo" in \r\n                    p[\\ \\\t] | pick[\\ \\\t]*)\r\n                        r="|CHERRY-PICKING";\r\n                        return 0\r\n                    ;;\r\n                    revert[\\ \\\t]*)\r\n                        r="|REVERTING";\r\n                        return 0\r\n                    ;;\r\n                esac;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n__load_completion () \r\n{ \r\n    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);\r\n    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;\r\n    [[ -n $cmd ]] || return 1;\r\n    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};\r\n    do\r\n        dirs+=($dir/bash-completion/completions);\r\n    done;\r\n    IFS=$ifs;\r\n    if [[ $BASH_SOURCE == */* ]]; then\r\n        dirs+=("${BASH_SOURCE%/*}/completions");\r\n    else\r\n        dirs+=(./completions);\r\n    fi;\r\n    local backslash=;\r\n    if [[ $cmd == \\\\* ]]; then\r\n        cmd="${cmd:1}";\r\n        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\\\$cmd" &amp;&amp; return 0;\r\n        backslash=\\\\;\r\n    fi;\r\n    for dir in "${dirs[@]}";\r\n    do\r\n        [[ -d $dir ]] || continue;\r\n        for compfile in "$cmd" "$cmd.bash" "_$cmd";\r\n        do\r\n            compfile="$dir/$compfile";\r\n            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then\r\n                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\\\$cmd";\r\n                return 0;\r\n            fi;\r\n        done;\r\n    done;\r\n    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;\r\n    return 1\r\n}\r\n__ltrim_colon_completions () \r\n{ \r\n    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then\r\n        local colon_word=${1%"${1##*:}"};\r\n        local i=${#COMPREPLY[*]};\r\n        while ((i-- &gt; 0)); do\r\n            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};\r\n        done;\r\n    fi\r\n}\r\n__parse_options () \r\n{ \r\n    local option option2 i IFS=\' \t\r\n,/|\';\r\n    option=;\r\n    local -a array=($1);\r\n    for i in "${array[@]}";\r\n    do\r\n        case "$i" in \r\n            ---*)\r\n                break\r\n            ;;\r\n            --?*)\r\n                option=$i;\r\n                break\r\n            ;;\r\n            -?*)\r\n                [[ -n $option ]] || option=$i\r\n            ;;\r\n            *)\r\n                break\r\n            ;;\r\n        esac;\r\n    done;\r\n    [[ -n $option ]] || return 0;\r\n    IFS=\' \t\r\n\';\r\n    if [[ $option =~ (\\[((no|dont)-?)\\]). ]]; then\r\n        option2=${option/"${BASH_REMATCH[1]}"/};\r\n        option2=${option2%%[&lt;{().[]*};\r\n        printf \'%s\\n\' "${option2/=*/=}";\r\n        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};\r\n    fi;\r\n    option=${option%%[&lt;{().[]*};\r\n    printf \'%s\\n\' "${option/=*/=}"\r\n}\r\n__reassemble_comp_words_by_ref () \r\n{ \r\n    local exclude i j line ref;\r\n    if [[ -n $1 ]]; then\r\n        exclude="[${1//[^$COMP_WORDBREAKS]/}]";\r\n    fi;\r\n    printf -v "$3" %s "$COMP_CWORD";\r\n    if [[ -v exclude ]]; then\r\n        line=$COMP_LINE;\r\n        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))\r\n        do\r\n            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do\r\n                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));\r\n                ref="$2[$j]";\r\n                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n                line=${line#*"${COMP_WORDS[i]}"};\r\n                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));\r\n                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;\r\n            done;\r\n            ref="$2[$j]";\r\n            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n            line=${line#*"${COMP_WORDS[i]}"};\r\n            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n        done;\r\n        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n    else\r\n        for i in "${!COMP_WORDS[@]}";\r\n        do\r\n            printf -v "$2[i]" %s "${COMP_WORDS[i]}";\r\n        done;\r\n    fi\r\n}\r\n_allowed_groups () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -g -- "$1"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));\r\n    fi\r\n}\r\n_allowed_users () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -u -- "${1:-$cur}"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));\r\n    fi\r\n}\r\n_apport-bug () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        ubuntu-bug | apport-bug)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions="--tag";\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-cli () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help -f --file-bug -u --update-bug -s --symptom \\\r\n                 -c --crash-file --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        apport-cli)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        -f | --file-bug)\r\n            param="-P --pid -p --package -s --symptom";\r\n            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        -s | --symptom)\r\n            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -c | --crash-file)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-collect () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-collect)\r\n            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))\r\n        ;;\r\n        -p | --package)\r\n            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))\r\n        ;;\r\n        --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            if [[ "${COMP_WORDS[*]}" =~ .*\\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then\r\n                COMPREPLY=($( compgen -W "--tag" -- $cur));\r\n            else\r\n                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));\r\n            fi\r\n        ;;\r\n    esac\r\n}\r\n_apport-unpack () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-unpack)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n    esac\r\n}\r\n_apport_parameterless () \r\n{ \r\n    local param;\r\n    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";\r\n    COMPREPLY=($( compgen -W "$param" -- $cur))\r\n}\r\n_apport_symptoms () \r\n{ \r\n    local syms;\r\n    if [ -r /usr/share/apport/symptoms ]; then\r\n        for FILE in $(ls /usr/share/apport/symptoms);\r\n        do\r\n            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\\s*\\(.*\\):" /usr/share/apport/symptoms/$FILE) ]]; then\r\n                syms="$syms ${FILE%.py}";\r\n            fi;\r\n        done;\r\n    fi;\r\n    echo $syms\r\n}\r\n_available_interfaces () \r\n{ \r\n    local PATH=$PATH:/sbin;\r\n    COMPREPLY=($({\r\n        if [[ ${1:-} == -w ]]; then\r\n            iwconfig\r\n        elif [[ ${1:-} == -a ]]; then\r\n            ifconfig || ip link show up\r\n        else\r\n            ifconfig -a || ip link show\r\n        fi\r\n    } 2&gt;/dev/null | awk         \'/^[^ \\t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }\'));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]/%[[:punct:]]/}\' -- "$cur"))\r\n}\r\n_bashcomp_try_faketty () \r\n{ \r\n    if type unbuffer &amp;&gt; /dev/null; then\r\n        unbuffer -p "$@";\r\n    else\r\n        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then\r\n            script -qaefc "$*" /dev/null;\r\n        else\r\n            "$@";\r\n        fi;\r\n    fi\r\n}\r\n_cd () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    local IFS=\'\r\n\' i j k;\r\n    compopt -o filenames;\r\n    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then\r\n        _filedir -d;\r\n        return;\r\n    fi;\r\n    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);\r\n    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);\r\n    for i in ${CDPATH//:/\'\r\n\'};\r\n    do\r\n        k="${#COMPREPLY[@]}";\r\n        for j in $(compgen -d -- $i/$cur);\r\n        do\r\n            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then\r\n                j+="/";\r\n            fi;\r\n            COMPREPLY[k++]=${j#$i/};\r\n        done;\r\n    done;\r\n    _filedir -d;\r\n    if ((${#COMPREPLY[@]} == 1)); then\r\n        i=${COMPREPLY[0]};\r\n        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then\r\n            COMPREPLY[0]="${i}/";\r\n        fi;\r\n    fi;\r\n    return\r\n}\r\n_cd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))\r\n}\r\n_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.421397" elapsed="0.004559">OSError: [Errno 36] File name too long: 'fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\'...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.426055" elapsed="0.000022"/>
</return>
<arg>delete-not-existing</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.813439" elapsed="1.612769">OSError: [Errno 36] File name too long: 'fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\'...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:49:05.427640" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:49:05.427231" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.427208" elapsed="0.000540"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:49:05.427935" elapsed="0.000358"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.435161" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:49:05.434481" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:49:05.435423" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.435270" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.435249" elapsed="0.000260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.436016" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:49:05.435679" elapsed="0.000365"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:49:05.436459" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Delete_Not_Existing_Element</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.436192" elapsed="0.000294"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:49:05.436863" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:49:05.436644" elapsed="0.000244"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.437381" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:49:05.437030" elapsed="0.000377"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.437899" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:49:05.437564" elapsed="0.000363"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.438510" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\'...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:49:05.438069" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.439058" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:49:05.438759" elapsed="0.000346"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:49:05.434172" elapsed="0.004989"/>
</kw>
<status status="PASS" start="2026-04-25T23:49:05.427004" elapsed="0.012240"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:49:05.426588" elapsed="0.012699"/>
</kw>
<doc>Attempt to delete the elements again and check that it fails with the correct error.</doc>
<status status="FAIL" start="2026-04-25T23:49:03.749305" elapsed="1.690025">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\'...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="delete"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t46" name="Commit_Delete_Not_Existing_Module" line="307">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:49:05.442704" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:49:05.442424" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.443993" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.443877" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.443855" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.448569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.448459" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.448440" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.449637" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:49:05.449247" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.450218" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:49:05.449843" elapsed="0.000402"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:49:05.450291" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:49:05.450454" 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-04-25T23:49:05.448879" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.455853" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.455719" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.455698" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.457177" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.457067" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.457047" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:49:05.457826" 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-04-25T23:49:05.457388" elapsed="0.000471"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.458277" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:05.458013" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.459155" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.458862" elapsed="0.001292">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:49:05.460344" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:49:05.460392" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.458453" elapsed="0.001968"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.461286" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.460993" elapsed="0.001382">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:49:05.462557" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:49:05.462604" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.460581" elapsed="0.002048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.463572" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.462942" elapsed="0.000729">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:49:05.462725" elapsed="0.001048">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:49:05.462704" elapsed="0.001106">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.463985" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.464210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:49:05.464078" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:49:05.464060" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.464343" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:05.467310" elapsed="0.000164"/>
</kw>
<msg time="2026-04-25T23:49:05.467549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:49:05.466623" elapsed="0.001038"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.468511" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.469360" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:49:05.465218" elapsed="0.004263"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:49:05.464608" elapsed="0.004991"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.456747" elapsed="0.013049">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</status>
</kw>
<msg time="2026-04-25T23:49:05.469907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:49:05.469951" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Delete_Not_Existing_Module"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.456068" elapsed="0.013908"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.470180" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.470064" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.470038" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.471233" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:49:05.471119" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.471096" elapsed="0.000207"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.471621" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:49:05.471746" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:49:05.471486" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.472213" 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-04-25T23:49:05.471937" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:49:05.472665" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:49:05.472400" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.473219" elapsed="0.000329"/>
</kw>
<msg time="2026-04-25T23:49:05.473763" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:49:05.473815" level="INFO">${old_connection_index} = 85</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.472861" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:05.474643" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.476723" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.476254" elapsed="0.001020">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.475055" elapsed="0.002299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:49:05.478871" elapsed="0.000375"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.477584" elapsed="0.001731"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:49:05.474141" elapsed="0.005277"/>
</kw>
<status status="PASS" start="2026-04-25T23:49:05.473919" elapsed="0.005553"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.473899" elapsed="0.005599"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:49:05.480468" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.480046" elapsed="0.000449"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:49:05.480545" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:49:05.480718" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:49:05.479713" elapsed="0.001031"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.480889" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.481594" level="INFO">index=86
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:49:05.481478" elapsed="0.000274"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:49:05.481891" elapsed="0.002099"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.484423" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:49:05.485590" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.484146" elapsed="0.001935">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:49:05.495633" elapsed="0.000369"/>
</kw>
<msg time="2026-04-25T23:49:05.496062" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:49:05.494354" elapsed="0.001799"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.496482" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.496762" elapsed="0.000056"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:49:05.486895" elapsed="0.010053"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:49:05.486358" elapsed="0.010641"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.470631" elapsed="0.026453">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.497412" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:49:05.497494" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.455357" elapsed="0.042248">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:49:05.497966" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:49:05.498013" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.450889" elapsed="0.047148"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:49:05.498360" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:49:05.498118" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-25T23:49:05.498098" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:49:05.450754" elapsed="0.047711"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:49:05.450540" elapsed="0.047963"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:49:05.448090" elapsed="0.050475"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:49:05.443530" elapsed="0.055094"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:49:05.443112" elapsed="0.055575"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:49:05.440355" elapsed="0.058388"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:49:05.500086" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:49:05.500240" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:49:05.499829" elapsed="0.000439"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:49:05.500312" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:49:05.500462" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:49:05.499493" elapsed="0.000996"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:49:05.501301" elapsed="0.000326"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.502617" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:49:05.501947" elapsed="0.000741"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:49:05.508528" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:49:05.502831" elapsed="0.005766"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:49:05.500999" elapsed="0.007677"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.527712" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.508827" elapsed="60.028516">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.538931" elapsed="0.000466"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.500638" elapsed="60.039800">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.540518" elapsed="0.000018"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.499199" elapsed="60.041872">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.544359" elapsed="0.000052"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.545940" elapsed="0.000029"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.546125" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.546288" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.546359" elapsed="0.000022"/>
</return>
<arg>commit-no-transaction</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:49:05.498915" elapsed="60.047590">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.549346" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:50:05.547923" elapsed="0.001456"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:50:05.549617" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.549466" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.549441" elapsed="0.000290"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:50:05.549913" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.551324" level="FAIL">'4455' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.550630" elapsed="0.000765">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-25T23:50:05.551491" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:50:05.550282" elapsed="0.001234"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.552470" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:50:05.552126" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.552955" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:50:05.552647" elapsed="0.000334"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.553415" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:50:05.553123" elapsed="0.000318"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.554414" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:50:05.553583" elapsed="0.000883"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.554867" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:05.554609" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.555553" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4455'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-25T23:50:05.555213" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-25T23:50:05.554978" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.554959" elapsed="0.000717"/>
</if>
<arg>4455</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:50:05.547479" elapsed="0.008248"/>
</kw>
<doc>Attempt to commit and check the reply.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4455</tag>
<status status="FAIL" start="2026-04-25T23:49:05.439876" elapsed="60.115904">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t47" name="Remove_Not_Existing_Module" line="312">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:50:05.560172" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:50:05.559921" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.561414" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.561303" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.561285" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.565955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.565850" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.565832" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.566994" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:50:05.566597" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.567465" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:50:05.567169" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:50:05.567537" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:50:05.567714" 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-04-25T23:50:05.566236" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.572978" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.572870" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.572851" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.574285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.574179" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.574162" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:50:05.574863" 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-04-25T23:50:05.574482" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.575288" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:05.575036" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.576124" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.575847" elapsed="0.001666">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:50:05.577719" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:50:05.577766" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.575460" elapsed="0.002330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.578603" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.578326" elapsed="0.001303">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:50:05.579824" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:50:05.579870" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.577947" elapsed="0.001947"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.580801" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.580179" elapsed="0.000702">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:50:05.579970" elapsed="0.001009">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:50:05.579951" elapsed="0.001062">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.581160" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.581375" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:50:05.581246" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:50:05.581229" elapsed="0.000277"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.581540" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:05.584407" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:50:05.584633" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:50:05.583755" elapsed="0.000990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.585535" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.586415" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:50:05.582391" elapsed="0.004136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:50:05.581817" elapsed="0.004827"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.573878" elapsed="0.012957">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</status>
</kw>
<msg time="2026-04-25T23:50:05.586939" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:50:05.586982" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Remove_Not_Existing_Module"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.573182" elapsed="0.013825"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.587189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.587083" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.587064" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.588213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:05.588104" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.588084" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.589010" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:50:05.589118" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:50:05.588419" elapsed="0.000727"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.589549" level="INFO">{1: 86}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:05.589288" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:05.590003" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:05.589759" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:50:05.590537" elapsed="0.000439"/>
</kw>
<msg time="2026-04-25T23:50:05.591075" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:50:05.591121" level="INFO">${old_connection_index} = 86</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.590193" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:05.591957" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.593981" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.593526" elapsed="0.000989">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.592340" elapsed="0.002252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:50:05.596058" 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-04-25T23:50:05.594954" elapsed="0.001525"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:50:05.591443" elapsed="0.005138"/>
</kw>
<status status="PASS" start="2026-04-25T23:50:05.591219" elapsed="0.005413"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.591201" elapsed="0.005470"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:50:05.597663" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:50:05.597182" elapsed="0.000511"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:50:05.597743" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:50:05.597903" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:50:05.596867" elapsed="0.001061"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:50:05.598070" elapsed="0.000414"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.598769" level="INFO">index=87
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:50:05.598638" elapsed="0.000256"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:50:05.599029" elapsed="0.002041"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.601479" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:50:05.604237" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.601221" elapsed="0.003413">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:05.614177" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:50:05.614557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:50:05.612938" elapsed="0.001708"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.615266" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.615516" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:50:05.605425" elapsed="0.010252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:50:05.604914" elapsed="0.010816"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.587632" elapsed="0.028181">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.616145" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:50:05.616219" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.572514" elapsed="0.043811">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:50:05.616433" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:50:05.616477" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.568109" elapsed="0.048392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:05.616845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:50:05.616579" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:05.616561" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:50:05.567979" elapsed="0.048967"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:50:05.567798" elapsed="0.049181"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:50:05.565469" elapsed="0.051569"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:50:05.561015" elapsed="0.056080"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:05.560575" elapsed="0.056567"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:50:05.557260" elapsed="0.059936"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:50:05.618538" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:50:05.618719" level="INFO">${data} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:50:05.618318" elapsed="0.000431"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:50:05.618796" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:50:05.618945" level="INFO">${request} = &lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
&lt;edit-config&gt;
    &lt;target&gt;
        &lt;candidate/&gt;
    &lt;/target&gt;
    &lt;test-option&gt;
        set
    &lt;/test-option&gt;
    &lt;default-operati...</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:50:05.618013" elapsed="0.000960"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.625733" level="INFO">&lt;rpc message-id="6" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:50:05.619804" elapsed="0.006039"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.626972" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:50:05.626072" elapsed="0.000955"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:50:05.827401" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         &lt;candidate/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/target&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;         set
[?2004lBASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="11")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="1" [2]="16" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.1.16(1)-release'
COLUMNS=80
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
DIRSTACK=()
EUID=1001
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/jenkins/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/jenkins
HOSTNAME=releng-58418-84-0-builder-0
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=jenkins
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
MANPATH=:/opt/puppetlabs/puppet/share/man
MOTD_SHOWN=pam
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/puppetlabs/bin
PIPESTATUS=([0]="2")
PPID=2671
PS1='[\u@\h \W]&gt; '
PS2='&gt; '
PS4='+ '
PWD=/home/jenkins
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='10.30.171.41 59558 22'
SSH_CONNECTION='10.30.171.41 59558 10.30.170.206 22'
SSH_TTY=/dev/pts/1
TERM=vt100
UID=1001
USER=jenkins
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_RUNTIME_DIR=/run/user/1001
XDG_SESSION_CLASS=user
XDG_SESSION_ID=25
XDG_SESSION_TYPE=tty
_=set
__git_printf_supports_v=yes
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
snap_bin_path=/snap/bin
snap_xdg_path=/var/lib/snapd/desktop
xmlns=urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car
__expand_tilde_by_ref () 
{ 
    if [[ ${!1-} == \~* ]]; then
        eval $1="$(printf ~%q "${!1#\~}")";
    fi
}
__get_cword_at_cursor_by_ref () 
{ 
    local cword words=();
    __reassemble_comp_words_by_ref "$1" words cword;
    local i cur="" index=$COMP_POINT lead=${COMP_LINE:0:COMP_POINT};
    if [[ $index -gt 0 &amp;&amp; ( -n $lead &amp;&amp; -n ${lead//[[:space:]]/} ) ]]; then
        cur=$COMP_LINE;
        for ((i = 0; i &lt;= cword; ++i))
        do
            while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]-}" ]]; do
                cur="${cur:1}";
                ((index &gt; 0)) &amp;&amp; ((index--));
            done;
            if ((i &lt; cword)); then
                local old_size=${#cur};
                cur="${cur#"${words[i]}"}";
                local new_size=${#cur};
                ((index -= old_size - new_size));
            fi;
        done;
        [[ -n $cur &amp;&amp; ! -n ${cur//[[:space:]]/} ]] &amp;&amp; cur=;
        ((index &lt; 0)) &amp;&amp; index=0;
    fi;]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:50:05.627172" elapsed="0.206201"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:50:05.619408" elapsed="0.214113"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.474256" level="INFO">local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () 
{ 
    local exit=$?;
    local pcmode=no;
    local detached=no;
    local ps1pc_start='\u@\h:\w ';
    local ps1pc_end='\$ ';
    local printf_format=' (%s)';
    case "$#" in 
        2 | 3)
            pcmode=yes;
            ps1pc_start="$1";
            ps1pc_end="$2";
            printf_format="${3:-$printf_format}";
            PS1="$ps1pc_start$ps1pc_end"
        ;;
        0 | 1)
            printf_format="${1:-$printf_format}"
        ;;
        *)
            return $exit
        ;;
    esac;
    local ps1_expanded=yes;
    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;
    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;
    local repo_info rev_parse_exit_code;
    repo_info="$(git rev-parse --git-dir --is-inside-git-dir 		--is-bare-repository --is-inside-work-tree 		--short HEAD 2&gt;/dev/null)";
    rev_parse_exit_code="$?";
    if [ -z "$repo_info" ]; then
        return $exit;
    fi;
    local short_sha="";
    if [ "$rev_parse_exit_code" = "0" ]; then
        short_sha="${repo_info##*
}";
        repo_info="${repo_info%
*}";
    fi;
    local inside_worktree="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local bare_repo="${repo_info##*
}";
    repo_info="${repo_info%
*}";
    local inside_gitdir="${repo_info##*
}";
    local g="${repo_info%
*}";
    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then
        return $exit;
    fi;
    local sparse="";
    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
        sparse="|SPARSE";
    fi;
    local r="";
    local b="";
    local step="";
    local total="";
    if [ -d "$g/rebase-merge" ]; then
        __git_eread "$g/rebase-merge/head-name" b;
        __git_eread "$g/rebase-merge/msgnum" step;
        __git_eread "$g/rebase-merge/end" total;
        r="|REBASE";
    else
        if [ -d "$g/rebase-apply" ]; then
            __git_eread "$g/rebase-apply/next" step;
            __git_eread "$g/rebase-apply/last" total;
            if [ -f "$g/rebase-apply/rebasing" ]; then
                __git_eread "$g/rebase-apply/head-name" b;
                r="|REBASE";
            else
                if [ -f "$g/rebase-apply/applying" ]; then
                    r="|AM";
                else
                    r="|AM/REBASE";
                fi;
            fi;
        else
            if [ -f "$g/MERGE_HEAD" ]; then
                r="|MERGING";
            else
                if __git_sequencer_status; then
                    :;
                else
                    if [ -f "$g/BISECT_LOG" ]; then
                        r="|BISECTING";
                    fi;
                fi;
            fi;
        fi;
        if [ -n "$b" ]; then
            :;
        else
            if [ -h "$g/HEAD" ]; then
                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";
            else
                local head="";
                if ! __git_eread "$g/HEAD" head; then
                    return $exit;
                fi;
                b="${head#ref: }";
                if [ "$head" = "$b" ]; then
                    detached=yes;
                    b="$(
				case "${GIT_PS1_DESCRIBE_STYLE-}" in
				(contains)
					git describe --contains HEAD ;;
				(branch)
					git describe --contains --all HEAD ;;
				(tag)
					git describe --tags HEAD ;;
				(describe)
					git describe HEAD ;;
				(* | default)
					git describe --tags --exact-match HEAD ;;
				esac 2&gt;/dev/null)" || b="$short_sha...";
                    b="($b)";
                fi;
            fi;
        fi;
    fi;
    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then
        r="$r $step/$total";
    fi;
    local w="";
    local i="";
    local s="";
    local u="";
    local h="";
    local c="";
    local p="";
    if [ "true" = "$inside_gitdir" ]; then
        if [ "true" = "$bare_repo" ]; then
            c="BARE:";
        else
            b="GIT_DIR!";
        fi;
    else
        if [ "true" = "$inside_worktree" ]; then
            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                git diff --no-ext-diff --quiet || w="*";
                git diff --no-ext-diff --cached --quiet || i="+";
                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then
                    i="#";
                fi;
            fi;
            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then
                s="$";
            fi;
            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' &gt; /dev/null 2&gt; /dev/null; then
                u="%${ZSH_VERSION+%}";
            fi;
            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
                h="?";
            fi;
            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
                __git_ps1_show_upstream;
            fi;
        fi;
    fi;
    local z="${GIT_PS1_STATESEPARATOR-" "}";
    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
            __git_ps1_colorize_gitstring;
        fi;
    fi;
    b=${b##refs/heads/};
    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    fi;
    local f="$h$w$i$s$u";
    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";
    if [ $pcmode = yes ]; then
        if [ "${__git_printf_supports_v-}" != yes ]; then
            gitstring=$(printf -- "$printf_format" "$gitstring");
        else
            printf -v gitstring -- "$printf_format" "$gitstring";
        fi;
        PS1="$ps1pc_start$gitstring$ps1pc_end";
    else
        printf -- "$printf_format" "$gitstring";
    fi;
    return $exit
}
__git_ps1_colorize_gitstring () 
{ 
    if [[ -n ${ZSH_VERSION-} ]]; then
        local c_red='%F{red}';
        local c_green='%F{green}';
        local c_lblue='%F{blue}';
        local c_clear='%f';
    else
        local c_red='\[\e[31m\]';
        local c_green='\[\e[32m\]';
        local c_lblue='\[\e[1;34m\]';
        local c_clear='\[\e[0m\]';
    fi;
    local bad_color=$c_red;
    local ok_color=$c_green;
    local flags_color="$c_lblue";
    local branch_color="";
    if [ $detached = no ]; then
        branch_color="$ok_color";
    else
        branch_color="$bad_color";
    fi;
    c="$branch_color$c";
    z="$c_clear$z";
    if [ "$w" = "*" ]; then
        w="$bad_color$w";
    fi;
    if [ -n "$i" ]; then
        i="$ok_color$i";
    fi;
    if [ -n "$s" ]; then
        s="$flags_color$s";
    fi;
    if [ -n "$u" ]; then
        u="$bad_color$u";
    fi;
    r="$c_clear$r"
}
__git_ps1_show_upstream () 
{ 
    local key value;
    local svn_remote svn_url_pattern count n;
    local upstream=git legacy="" verbose="" name="";
    svn_remote=();
    local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2&gt;/dev/null | tr '\0\n' '\n ')";
    while read -r key value; do
        case "$key" in 
            bash.showupstream)
                GIT_PS1_SHOWUPSTREAM="$value";
                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
                    p="";
                    return;
                fi
            ;;
            svn-remote.*.url)
                svn_remote[$((${#svn_remote[@]} + 1))]="$value";
                svn_url_pattern="$svn_url_pattern\\|$value";
                upstream=svn+git
            ;;
        esac;
    done &lt;&lt;&lt; "$output";
    local option;
    for option in ${GIT_PS1_SHOWUPSTREAM};
    do
        case "$option" in 
            git | svn)
                upstream="$option"
            ;;
            verbose)
                verbose=1
            ;;
            legacy)
                legacy=1
            ;;
            name)
                name=1
            ;;
        esac;
    done;
    case "$upstream" in 
        git)
            upstream="@{upstream}"
        ;;
        svn*)
            local -a svn_upstream;
            svn_upstream=($(git log --first-parent -1 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2&gt;/dev/null));
            if [[ 0 -ne ${#svn_upstream[@]} ]]; then
                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};
                svn_upstream=${svn_upstream%@*};
                local n_stop="${#svn_remote[@]}";
                for ((n=1; n &lt;= n_stop; n++))
                do
                    svn_upstream=${svn_upstream#${svn_remote[$n]}};
                done;
                if [[ -z "$svn_upstream" ]]; then
                    upstream=${GIT_SVN_ID:-git-svn};
                else
                    upstream=${svn_upstream#/};
                fi;
            else
                if [[ "svn+git" = "$upstream" ]]; then
                    upstream="@{upstream}";
                fi;
            fi
        ;;
    esac;
    if [[ -z "$legacy" ]]; then
        count="$(git rev-list --count --left-right 				"$upstream"...HEAD 2&gt;/dev/null)";
    else
        local commits;
        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then
            local commit behind=0 ahead=0;
            for commit in $commits;
            do
                case "$commit" in 
                    "&lt;"*)
                        ((behind++))
                    ;;
                    *)
                        ((ahead++))
                    ;;
                esac;
            done;
            count="$behind	$ahead";
        else
            count="";
        fi;
    fi;
    if [[ -z "$verbose" ]]; then
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p="="
            ;;
            "0	"*)
                p="&gt;"
            ;;
            *"	0")
                p="&lt;"
            ;;
            *)
                p="&lt;&gt;"
            ;;
        esac;
    else
        case "$count" in 
            "")
                p=""
            ;;
            "0	0")
                p=" u="
            ;;
            "0	"*)
                p=" u+${count#0	}"
            ;;
            *"	0")
                p=" u-${count%	0}"
            ;;
            *)
                p=" u+${count#*	}-${count%	*}"
            ;;
        esac;
        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2&gt;/dev/null);
            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then
                p="$p \${__git_ps1_upstream_name}";
            else
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            fi;
        fi;
    fi
}
__git_sequencer_status () 
{ 
    local todo;
    if test -f "$g/CHERRY_PICK_HEAD"; then
        r="|CHERRY-PICKING";
        return 0;
    else
        if test -f "$g/REVERT_HEAD"; then
            r="|REVERTING";
            return 0;
        else
            if __git_eread "$g/sequencer/todo" todo; then
                case "$todo" in 
                    p[\ \	] | pick[\ \	]*)
                        r="|CHERRY-PICKING";
                        return 0
                    ;;
                    revert[\ \	]*)
                        r="|REVERTING";
                        return 0
                    ;;
                esac;
            fi;
        fi;
    fi;
    return 1
}
__load_completion () 
{ 
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;
    [[ -n $cmd ]] || return 1;
    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};
    do
        dirs+=($dir/bash-completion/completions);
    done;
    IFS=$ifs;
    if [[ $BASH_SOURCE == */* ]]; then
        dirs+=("${BASH_SOURCE%/*}/completions");
    else
        dirs+=(./completions);
    fi;
    local backslash=;
    if [[ $cmd == \\* ]]; then
        cmd="${cmd:1}";
        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\$cmd" &amp;&amp; return 0;
        backslash=\\;
    fi;
    for dir in "${dirs[@]}";
    do
        [[ -d $dir ]] || continue;
        for compfile in "$cmd" "$cmd.bash" "_$cmd";
        do
            compfile="$dir/$compfile";
            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then
                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\$cmd";
                return 0;
            fi;
        done;
    done;
    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;
    return 1
}
__ltrim_colon_completions () 
{ 
    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then
        local colon_word=${1%"${1##*:}"};
        local i=${#COMPREPLY[*]};
        while ((i-- &gt; 0)); do
            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};
        done;
    fi
}
__parse_options () 
{ 
    local option option2 i IFS=' 	
,/|';
    option=;
    local -a array=($1);
    for i in "${array[@]}";
    do
        case "$i" in 
            ---*)
                break
            ;;
            --?*)
                option=$i;
                break
            ;;
            -?*)
                [[ -n $option ]] || option=$i
            ;;
            *)
                break
            ;;
        esac;
    done;
    [[ -n $option ]] || return 0;
    IFS=' 	
';
    if [[ $option =~ (\[((no|dont)-?)\]). ]]; then
        option2=${option/"${BASH_REMATCH[1]}"/};
        option2=${option2%%[&lt;{().[]*};
        printf '%s\n' "${option2/=*/=}";
        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};
    fi;
    option=${option%%[&lt;{().[]*};
    printf '%s\n' "${option/=*/=}"
}
__reassemble_comp_words_by_ref () 
{ 
    local exclude i j line ref;
    if [[ -n $1 ]]; then
        exclude="[${1//[^$COMP_WORDBREAKS]/}]";
    fi;
    printf -v "$3" %s "$COMP_CWORD";
    if [[ -v exclude ]]; then
        line=$COMP_LINE;
        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))
        do
            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do
                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));
                ref="$2[$j]";
                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
                line=${line#*"${COMP_WORDS[i]}"};
                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));
                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;
            done;
            ref="$2[$j]";
            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";
            line=${line#*"${COMP_WORDS[i]}"};
            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
        done;
        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";
    else
        for i in "${!COMP_WORDS[@]}";
        do
            printf -v "$2[i]" %s "${COMP_WORDS[i]}";
        done;
    fi
}
_allowed_groups () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -g -- "$1"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));
    fi
}
_allowed_users () 
{ 
    if _complete_as_root; then
        local IFS='
';
        COMPREPLY=($(compgen -u -- "${1:-$cur}"));
    else
        local IFS='
 ';
        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));
    fi
}
_apport-bug () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help --save -v --version --tag -w --window';
    case "$prev" in 
        ubuntu-bug | apport-bug)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions="--tag";
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-cli () 
{ 
    local cur dashoptions prev param;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \
                 -c --crash-file --save -v --version --tag -w --window';
    case "$prev" in 
        apport-cli)
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
        -f | --file-bug)
            param="-P --pid -p --package -s --symptom";
            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))
        ;;
        -s | --symptom)
            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))
        ;;
        --save)
            COMPREPLY=($( compgen -o default -G "$cur*" ))
        ;;
        -c | --crash-file)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
        -w | --window)
            dashoptions="--save --tag";
            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
        ;;
        -h | --help | -v | --version | --tag)
            return 0
        ;;
        *)
            dashoptions='--tag';
            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then
                dashoptions="--save $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\ -w\ .* ]]; then
                dashoptions="-w --window $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\ -s\ .* ]]; then
                dashoptions="-s --symptom $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\ -u\ .* ]]; then
                dashoptions="-u --update $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\ -f\ .* ]]; then
                dashoptions="-f --file-bug $dashoptions";
            fi;
            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\ -c\ .* ]]; then
                dashoptions="-c --crash-file $dashoptions";
            fi;
            case "$cur" in 
                -*)
                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))
                ;;
                *)
                    _apport_parameterless
                ;;
            esac
        ;;
    esac
}
_apport-collect () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-collect)
            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))
        ;;
        -p | --package)
            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))
        ;;
        --tag)
            return 0
        ;;
        *)
            if [[ "${COMP_WORDS[*]}" =~ .*\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then
                COMPREPLY=($( compgen -W "--tag" -- $cur));
            else
                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));
            fi
        ;;
    esac
}
_apport-unpack () 
{ 
    local cur prev;
    COMPREPLY=();
    cur=`_get_cword`;
    prev=${COMP_WORDS[COMP_CWORD-1]};
    case "$prev" in 
        apport-unpack)
            COMPREPLY=($( compgen -G "${cur}*.apport"
                       compgen -G "${cur}*.crash" ))
        ;;
    esac
}
_apport_parameterless () 
{ 
    local param;
    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    COMPREPLY=($( compgen -W "$param" -- $cur))
}
_apport_symptoms () 
{ 
    local syms;
    if [ -r /usr/share/apport/symptoms ]; then
        for FILE in $(ls /usr/share/apport/symptoms);
        do
            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\s*\(.*\):" /usr/share/apport/symptoms/$FILE) ]]; then
                syms="$syms ${FILE%.py}";
            fi;
        done;
    fi;
    echo $syms
}
_available_interfaces () 
{ 
    local PATH=$PATH:/sbin;
    COMPREPLY=($({
        if [[ ${1:-} == -w ]]; then
            iwconfig
        elif [[ ${1:-} == -a ]]; then
            ifconfig || ip link show up
        else
            ifconfig -a || ip link show
        fi
    } 2&gt;/dev/null | awk         '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }'));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur"))
}
_bashcomp_try_faketty () 
{ 
    if type unbuffer &amp;&gt; /dev/null; then
        unbuffer -p "$@";
    else
        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then
            script -qaefc "$*" /dev/null;
        else
            "$@";
        fi;
    fi
}
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then
        _filedir -d;
        return;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $(compgen -d -- $i/$cur);
        do
            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if ((${#COMPREPLY[@]} == 1)); then
        i=${COMPREPLY[0]};
        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return
}
_cd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))
}
_command () 
{ 
    local offset i;
    offset=1;
    for ((i = 1; i &lt;= COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            offset=$i;
            break;
        fi;
    done;
    _command_offset $offset
}
_command_offset () 
{ 
    local word_offset=$1 i j;
    for ((i = 0; i &lt; word_offset; i++))
    do
        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))
        do
            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;
            COMP_LINE=${COMP_LINE:1};
            ((COMP_POINT--));
        done;
        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};
        ((COMP_POINT -= ${#COMP_WORDS[i]}));
    done;
    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))
    do
        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};
    done;
    for ((i; i &lt;= COMP_CWORD; i++))
    do
        unset 'COMP_WORDS[i]';
    done;
    ((COMP_CWORD -= word_offset));
    COMPREPLY=();
    local cur;
    _get_comp_words_by_ref cur;
    if ((COMP_CWORD == 0)); then
        local IFS='
';
        compopt -o filenames;
        COMPREPLY=($(compgen -d -c -- "$cur"));
    else
        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};
        local cspec=$(complete -p $cmd 2&gt;/dev/null);
        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then
            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);
            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};
        fi;
        if [[ ! -n $cspec ]]; then
            compcmd=${cmd##*/};
            _completion_loader $compcmd;
            cspec=$(complete -p $compcmd 2&gt;/dev/null);
        fi;
        if [[ -n $cspec ]]; then
            if [[ ${cspec#* -F } != "$cspec" ]]; then
                local func=${cspec#*-F };
                func=${func%% *};
                if ((${#COMP_WORDS[@]} &gt;= 2)); then
                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";
                else
                    $func $cmd "${COMP_WORDS[-1]}";
                fi;
                local opt;
                while [[ $cspec == *" -o "* ]]; do
                    cspec=${cspec#*-o };
                    opt=${cspec%% *};
                    compopt -o $opt;
                    cspec=${cspec#$opt};
                done;
            else
                cspec=${cspec#complete};
                cspec=${cspec%%$compcmd};
                COMPREPLY=($(eval compgen "$cspec" -- '$cur'));
            fi;
        else
            if ((${#COMPREPLY[@]} == 0)); then
                _minimal;
            fi;
        fi;
    fi
}
_complete_as_root () 
{ 
    [[ $EUID -eq 0 || -n ${root_command:-} ]]
}
_completion_loader () 
{ 
    local cmd="${1:-_EmptycmD_}";
    __load_completion "$cmd" &amp;&amp; return 124;
    complete -F _minimal -- "$cmd" &amp;&amp; return 124
}
_configured_interfaces () 
{ 
    if [[ -f /etc/debian_version ]]; then
        COMPREPLY=($(compgen -W "$(command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));
    else
        if [[ -f /etc/SuSE-release ]]; then
            COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
        else
            if [[ -f /etc/pld-release ]]; then
                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            else
                COMPREPLY=($(compgen -W "$(printf '%s\n'             /etc/sysconfig/network-scripts/ifcfg-* |
            command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p')" -- "$cur"));
            fi;
        fi;
    fi
}
_count_args () 
{ 
    local i cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    args=1;
    for ((i = 1; i &lt; cword; i++))
    do
        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then
            ((args++));
        fi;
    done
}
_dvd_devices () 
{ 
    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))
}
_expand () 
{ 
    case ${cur-} in 
        ~*/*)
            __expand_tilde_by_ref cur
        ;;
        ~*)
            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\~}")";
            return ${#COMPREPLY[@]}
        ;;
    esac
}
_filedir () 
{ 
    local IFS='
';
    _tilde "${cur-}" || return;
    local -a toks;
    local reset arg=${1-};
    if [[ $arg == -d ]]; then
        reset=$(shopt -po noglob);
        set -o noglob;
        toks=($(compgen -d -- "${cur-}"));
        IFS=' ';
        $reset;
        IFS='
';
    else
        local quoted;
        _quote_readline_by_ref "${cur-}" quoted;
        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();
        local opts=(-f -X "$xspec");
        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);
        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");
        reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen "${opts[@]}" -- $quoted));
        IFS=' ';
        $reset;
        IFS='
';
        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
            reset=$(shopt -po noglob);
            set -o noglob;
            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));
            IFS=' ';
            $reset;
            IFS='
'
        };
    fi;
    if ((${#toks[@]} != 0)); then
        compopt -o filenames 2&gt; /dev/null;
        COMPREPLY+=("${toks[@]}");
    fi
}
_filedir_xspec () 
{ 
    local cur prev words cword;
    _init_completion || return;
    _tilde "$cur" || return;
    local IFS='
' xspec=${_xspecs[${1##*/}]} tmp;
    local -a toks;
    toks=($(
        compgen -d -- "$(quote_readline "$cur")" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ));
    eval xspec="${xspec}";
    local matchop=!;
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!};
        matchop=@;
    fi;
    xspec="$matchop($xspec|${xspec^^})";
    toks+=($(
        eval compgen -f -X "'!$xspec'" -- '$(quote_readline "$cur")' | {
            while read -r tmp; do
                [[ -n $tmp ]] &amp;&amp; printf '%s\n' $tmp
            done
        }
    ));
    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { 
        local reset=$(shopt -po noglob);
        set -o noglob;
        toks+=($(compgen -f -- "$(quote_readline "$cur")"));
        IFS=' ';
        $reset;
        IFS='
'
    };
    if ((${#toks[@]} != 0)); then
        compopt -o filenames;
        COMPREPLY=("${toks[@]}");
    fi
}
_fstypes () 
{ 
    local fss;
    if [[ -e /proc/filesystems ]]; then
        fss="$(cut -d'	' -f2 /proc/filesystems)
             $(awk '! /\*/ { print $NF }' /etc/filesystems 2&gt;/dev/null)";
    else
        fss="$(awk '/^[ \t]*[^#]/ { print $3 }' /etc/fstab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $3 }' /etc/mnttab 2&gt;/dev/null)
             $(awk '/^[ \t]*[^#]/ { print $4 }' /etc/vfstab 2&gt;/dev/null)
             $(awk '{ print $1 }' /etc/dfs/fstypes 2&gt;/dev/null)
             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";
    fi;
    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))
}
_get_comp_words_by_ref () 
{ 
    local exclude flag i OPTIND=1;
    local cur cword words=();
    local upargs=() upvars=() vcur vcword vprev vwords;
    while getopts "c:i:n:p:w:" flag "$@"; do
        case $flag in 
            c)
                vcur=$OPTARG
            ;;
            i)
                vcword=$OPTARG
            ;;
            n)
                exclude=$OPTARG
            ;;
            p)
                vprev=$OPTARG
            ;;
            w)
                vwords=$OPTARG
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    while [[ $# -ge $OPTIND ]]; do
        case ${!OPTIND} in 
            cur)
                vcur=cur
            ;;
            prev)
                vprev=prev
            ;;
            cword)
                vcword=cword
            ;;
            words)
                vwords=words
            ;;
            *)
                echo "bash_completion: $FUNCNAME: \`${!OPTIND}':" "unknown argument" 1&gt;&amp;2;
                return 1
            ;;
        esac;
        ((OPTIND += 1));
    done;
    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;
    [[ -v vcur ]] &amp;&amp; { 
        upvars+=("$vcur");
        upargs+=(-v $vcur "$cur")
    };
    [[ -v vcword ]] &amp;&amp; { 
        upvars+=("$vcword");
        upargs+=(-v $vcword "$cword")
    };
    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { 
        upvars+=("$vprev");
        upargs+=(-v $vprev "${words[cword - 1]}")
    };
    [[ -v vwords ]] &amp;&amp; { 
        upvars+=("$vwords");
        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})
    };
    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"
}
_get_cword () 
{ 
    local LC_CTYPE=C;
    local cword words;
    __reassemble_comp_words_by_ref "${1-}" words cword;
    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then
        printf "%s" "${words[cword - $2]}";
    else
        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then
            :;
        else
            local i;
            local cur="$COMP_LINE";
            local index="$COMP_POINT";
            for ((i = 0; i &lt;= cword; ++i))
            do
                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do
                    cur="${cur:1}";
                    ((index &gt; 0)) &amp;&amp; ((index--));
                done;
                if ((i &lt; cword)); then
                    local old_size="${#cur}";
                    cur="${cur#${words[i]}}";
                    local new_size="${#cur}";
                    ((index -= old_size - new_size));
                fi;
            done;
            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then
                printf "%s" "${words[cword]}";
            else
                printf "%s" "${cur:0:index}";
            fi;
        fi;
    fi
}
_get_first_arg () 
{ 
    local i;
    arg=;
    for ((i = 1; i &lt; COMP_CWORD; i++))
    do
        if [[ ${COMP_WORDS[i]} != -* ]]; then
            arg=${COMP_WORDS[i]};
            break;
        fi;
    done
}
_get_pword () 
{ 
    if ((COMP_CWORD &gt;= 1)); then
        _get_cword "${@:-}" 1;
    fi
}
_gids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent group | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/group)' -- "$cur"));
        fi;
    fi
}
_have () 
{ 
    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null
}
_included_ssh_config_files () 
{ 
    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;
    local configfile i f;
    configfile=$1;
    local reset=$(shopt -po noglob);
    set -o noglob;
    local included=($(command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\(.*\)$/\1/p' "${configfile}"));
    $reset;
    [[ -n ${included-} ]] || return;
    for i in "${included[@]}";
    do
        if ! [[ $i =~ ^\~.*|^\/.* ]]; then
            if [[ $configfile =~ ^\/etc\/ssh.* ]]; then
                i="/etc/ssh/$i";
            else
                i="$HOME/.ssh/$i";
            fi;
        fi;
        __expand_tilde_by_ref i;
        set +o noglob;
        for f in $i;
        do
            if [[ -r $f ]]; then
                config+=("$f");
                _included_ssh_config_files $f;
            fi;
        done;
        $reset;
    done
}
_init_completion () 
{ 
    local exclude="" flag outx errx inx OPTIND=1;
    while getopts "n:e:o:i:s" flag "$@"; do
        case $flag in 
            n)
                exclude+=$OPTARG
            ;;
            e)
                errx=$OPTARG
            ;;
            o)
                outx=$OPTARG
            ;;
            i)
                inx=$OPTARG
            ;;
            s)
                split=false;
                exclude+==
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    COMPREPLY=();
    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";
    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;
    _variables &amp;&amp; return 1;
    if [[ $cur == $redir* || ${prev-} == $redir ]]; then
        local xspec;
        case $cur in 
            2'&gt;'*)
                xspec=${errx-}
            ;;
            *'&gt;'*)
                xspec=${outx-}
            ;;
            *'&lt;'*)
                xspec=${inx-}
            ;;
            *)
                case $prev in 
                    2'&gt;'*)
                        xspec=${errx-}
                    ;;
                    *'&gt;'*)
                        xspec=${outx-}
                    ;;
                    *'&lt;'*)
                        xspec=${inx-}
                    ;;
                esac
            ;;
        esac;
        cur="${cur##$redir}";
        _filedir $xspec;
        return 1;
    fi;
    local i skip;
    for ((i = 1; i &lt; ${#words[@]}; 1))
    do
        if [[ ${words[i]} == $redir* ]]; then
            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;
            words=("${words[@]:0:i}" "${words[@]:i+skip}");
            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));
        else
            ((i++));
        fi;
    done;
    ((cword &lt;= 0)) &amp;&amp; return 1;
    prev=${words[cword - 1]};
    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;
    return 0
}
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
_ip_addresses () 
{ 
    local n;
    case ${1-} in 
        -a)
            n='6\?'
        ;;
        -6)
            n='6'
        ;;
        *)
            n=
        ;;
    esac;
    local PATH=$PATH:/sbin;
    local addrs=$({
        LC_ALL=C ifconfig -a || ip addr show
    } 2&gt;/dev/null |
        command sed -e 's/[[:space:]]addr:/ /' -ne             "s|.*inet${n}[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p");
    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))
}
_kernel_versions () 
{ 
    COMPREPLY=($(compgen -W '$(command ls /lib/modules)' -- "$cur"))
}
_known_hosts () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    local options;
    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;
    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";
    _known_hosts_real ${options-} -- "$cur"
}
_known_hosts_real () 
{ 
    local configfile flag prefix="" ifs=$IFS;
    local cur suffix="" aliases i host ipv4 ipv6;
    local -a kh tmpkh=() khd=() config=();
    local OPTIND=1;
    while getopts "ac46F:p:" flag "$@"; do
        case $flag in 
            a)
                aliases='yes'
            ;;
            c)
                suffix=':'
            ;;
            F)
                configfile=$OPTARG
            ;;
            p)
                prefix=$OPTARG
            ;;
            4)
                ipv4=1
            ;;
            6)
                ipv6=1
            ;;
            *)
                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done;
    if (($# &lt; OPTIND)); then
        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;
        return 1;
    fi;
    cur=${!OPTIND};
    ((OPTIND += 1));
    if (($# &gt;= OPTIND)); then
        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do
                printf '%s ' ${!OPTIND}
                shift
            done)" 1&gt;&amp;2;
        return 1;
    fi;
    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};
    kh=();
    if [[ -v configfile ]]; then
        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");
    else
        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;
        do
            [[ -r $i ]] &amp;&amp; config+=("$i");
        done;
    fi;
    local reset=$(shopt -po noglob);
    set -o noglob;
    if ((${#config[@]} &gt; 0)); then
        for i in "${config[@]}";
        do
            _included_ssh_config_files "$i";
        done;
    fi;
    if ((${#config[@]} &gt; 0)); then
        local IFS='
';
        tmpkh=($(awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u));
        IFS=$ifs;
    fi;
    if ((${#tmpkh[@]} != 0)); then
        local j;
        for i in "${tmpkh[@]}";
        do
            while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};
                j=${BASH_REMATCH[2]};
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
            for j in $i;
            do
                __expand_tilde_by_ref j;
                [[ -r $j ]] &amp;&amp; kh+=("$j");
            done;
        done;
    fi;
    if [[ ! -v configfile ]]; then
        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;
        do
            [[ -r $i ]] &amp;&amp; kh+=("$i");
        done;
        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;
        do
            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);
        done;
    fi;
    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then
        if ((${#kh[@]} &gt; 0)); then
            for i in "${kh[@]}";
            do
                while read -ra tmpkh; do
                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;
                    set -- "${tmpkh[@]}";
                    [[ $1 == [\|\#]* ]] &amp;&amp; continue;
                    [[ $1 == @* ]] &amp;&amp; shift;
                    local IFS=,;
                    for host in $1;
                    do
                        [[ $host == *[*?]* ]] &amp;&amp; continue;
                        host="${host#[}";
                        host="${host%]?(:+([0-9]))}";
                        COMPREPLY+=($host);
                    done;
                    IFS=$ifs;
                done &lt; "$i";
            done;
            COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
        fi;
        if ((${#khd[@]} &gt; 0)); then
            for i in "${khd[@]}";
            do
                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then
                    host=${i/#*key_22_/};
                    host=${host/%.pub/};
                    COMPREPLY+=($host);
                fi;
            done;
        fi;
        for i in ${!COMPREPLY[*]};
        do
            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;
        done;
    fi;
    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then
        local -a hosts=($(command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\(.*\)$/\1/p' "${config[@]}"));
        if ((${#hosts[@]} != 0)); then
            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W '${hosts[@]%%[*?%]*}' -X '\!*' -- "$cur"));
        fi;
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |
                awk -F';' '/^=/ { print $7 }' | sort -u)" -- "$cur"));
    fi;
    if type ruptime &amp;&gt; /dev/null; then
        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk '!/^ruptime:/ { print $1 }')"             -- "$cur"));
    fi;
    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then
        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));
    fi;
    $reset;
    if [[ -v ipv4 ]]; then
        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");
    fi;
    if [[ -v ipv6 ]]; then
        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");
    fi;
    if [[ -v ipv4 || -v ipv6 ]]; then
        for i in "${!COMPREPLY[@]}";
        do
            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";
        done;
    fi;
    __ltrim_colon_completions "$prefix$cur"
}
_longopt () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    case "${prev,,}" in 
        --help | --usage | --version)
            return
        ;;
        --!(no-*)dir*)
            _filedir -d;
            return
        ;;
        --!(no-*)@(file|path)*)
            _filedir;
            return
        ;;
        --+([-a-z0-9_]))
            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\[\{0,1\}=[&lt;[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p");
            case ${argtype,,} in 
                *dir*)
                    _filedir -d;
                    return
                ;;
                *file* | *path*)
                    _filedir;
                    return
                ;;
            esac
        ;;
    esac;
    $split &amp;&amp; return;
    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |
            while read -r line; do
                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;
                    printf '%s\n' ${BASH_REMATCH[0]}
            done)" -- "$cur"));
        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;
    else
        if [[ $1 == *@(rmdir|chroot) ]]; then
            _filedir -d;
        else
            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;
            _filedir;
        fi;
    fi
}
_mac_addresses () 
{ 
    local re='\([A-Fa-f0-9]\{2\}:\)\{5\}[A-Fa-f0-9]\{2\}';
    local PATH="$PATH:/sbin:/usr/sbin";
    COMPREPLY+=($(
        {
            LC_ALL=C ifconfig -a || ip link show
        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne             "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
    ));
    COMPREPLY+=($({
        arp -an || ip neigh show
    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne         "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p"));
    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2&gt;/dev/null));
    COMPREPLY=($(compgen -W '${COMPREPLY[@]}' -- "$cur"));
    __ltrim_colon_completions "$cur"
}
_minimal () 
{ 
    local cur prev words cword split;
    _init_completion -s || return;
    $split &amp;&amp; return;
    _filedir
}
_modules () 
{ 
    local modpath;
    modpath=/lib/modules/$1;
    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |
        command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p')" -- "$cur"))
}
_ncpus () 
{ 
    local var=NPROCESSORS_ONLN;
    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;
    local n=$(getconf $var 2&gt;/dev/null);
    printf %s ${n:-1}
}
_parse_help () 
{ 
    eval local cmd="$(quote "$1")";
    local line;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        [[ $line == *([[:blank:]])-* ]] || continue;
        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\.\.+)?\]? ]]; do
            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};
        done;
        __parse_options "${line// or /, }";
    done
}
_parse_usage () 
{ 
    eval local cmd="$(quote "$1")";
    local line match option i char;
    { 
        case $cmd in 
            -)
                cat
            ;;
            *)
                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1
            ;;
        esac
    } | while read -r line; do
        while [[ $line =~ \[[[:space:]]*(-[^]]+)[[:space:]]*\] ]]; do
            match=${BASH_REMATCH[0]};
            option=${BASH_REMATCH[1]};
            case $option in 
                -?(\[)+([a-zA-Z0-9?]))
                    for ((i = 1; i &lt; ${#option}; i++))
                    do
                        char=${option:i:1};
                        [[ $char != '[' ]] &amp;&amp; printf '%s\n' -$char;
                    done
                ;;
                *)
                    __parse_options "$option"
                ;;
            esac;
            line=${line#*"$match"};
        done;
    done
}
_pci_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur"))
}
_pgids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pgid=)' -- "$cur"))
}
_pids () 
{ 
    COMPREPLY=($(compgen -W '$(command ps axo pid=)' -- "$cur"))
}
_pnames () 
{ 
    local -a procs;
    if [[ ${1-} == -s ]]; then
        procs=($(command ps axo comm | command sed -e 1d));
    else
        local line i=-1 ifs=$IFS;
        IFS='
';
        local -a psout=($(command ps axo command=));
        IFS=$ifs;
        for line in "${psout[@]}";
        do
            if ((i == -1)); then
                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then
                    i=${#BASH_REMATCH[1]};
                else
                    break;
                fi;
            else
                line=${line:i};
                line=${line%% *};
                procs+=($line);
            fi;
        done;
        if ((i == -1)); then
            for line in "${psout[@]}";
            do
                if [[ $line =~ ^[[(](.+)[])]$ ]]; then
                    procs+=(${BASH_REMATCH[1]});
                else
                    line=${line%% *};
                    line=${line##@(*/|-)};
                    procs+=($line);
                fi;
            done;
        fi;
    fi;
    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W '${procs[@]}' -- "$cur"))
}
_quote_readline_by_ref () 
{ 
    if [ -z "$1" ]; then
        printf -v $2 %s "$1";
    else
        if [[ $1 == \'* ]]; then
            printf -v $2 %s "${1:1}";
        else
            if [[ $1 == \~* ]]; then
                printf -v $2 \~%q "${1:1}";
            else
                printf -v $2 %q "$1";
            fi;
        fi;
    fi;
    [[ ${!2} == \$* ]] &amp;&amp; eval $2=${!2}
}
_realcommand () 
{ 
    type -P "$1" &gt; /dev/null &amp;&amp; { 
        if type -p realpath &gt; /dev/null; then
            realpath "$(type -P "$1")";
        else
            if type -p greadlink &gt; /dev/null; then
                greadlink -f "$(type -P "$1")";
            else
                if type -p readlink &gt; /dev/null; then
                    readlink -f "$(type -P "$1")";
                else
                    type -P "$1";
                fi;
            fi;
        fi
    }
}
_rl_enabled () 
{ 
    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]
}
_root_command () 
{ 
    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;
    local root_command=$1;
    _command
}
_service () 
{ 
    local cur prev words cword;
    _init_completion || return;
    ((cword &gt; 2)) &amp;&amp; return;
    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then
        _services;
        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;
    else
        local sysvdirs;
        _sysvdirs;
        COMPREPLY=($(compgen -W '`command sed -e "y/|/ /" \
            -ne "s/^.*\(U\|msg_u\)sage.*{\(.*\)}.*$/\2/p" \
            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop' -- "$cur"));
    fi
}
_services () 
{ 
    local sysvdirs;
    _sysvdirs;
    local IFS=' 	
' reset=$(shopt -p nullglob);
    shopt -s nullglob;
    COMPREPLY=($(printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README)));
    $reset;
    COMPREPLY+=($({
        systemctl list-units --full --all ||
            systemctl list-unit-files
    } 2&gt;/dev/null |
        awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }'));
    if [[ -x /sbin/upstart-udev-bridge ]]; then
        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d' ' -f1));
    fi;
    COMPREPLY=($(compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur"))
}
_shells () 
{ 
    local shell rest;
    while read -r shell rest; do
        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);
    done 2&gt; /dev/null &lt; /etc/shells
}
_signals () 
{ 
    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));
    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")
}
_split_longopt () 
{ 
    if [[ $cur == --?*=* ]]; then
        prev="${cur%%?(\\)=*}";
        cur="${cur#*=}";
        return 0;
    fi;
    return 1
}
_sysvdirs () 
{ 
    sysvdirs=();
    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);
    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);
    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);
    return 0
}
_terms () 
{ 
    COMPREPLY+=($(compgen -W "$({
        command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap
        {
            toe -a || toe
        } | awk '{ print $1 }'
        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |
            awk -F/ '{ print $NF }'
    } 2&gt;/dev/null)" -- "$cur"))
}
_tilde () 
{ 
    local result=0;
    if [[ ${1-} == \~* &amp;&amp; $1 != */* ]]; then
        COMPREPLY=($(compgen -P '~' -u -- "${1#\~}"));
        result=${#COMPREPLY[@]};
        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;
    fi;
    return $result
}
_uids () 
{ 
    if type getent &amp;&gt; /dev/null; then
        COMPREPLY=($(compgen -W '$(getent passwd | cut -d: -f3)' -- "$cur"));
    else
        if type perl &amp;&gt; /dev/null; then
            COMPREPLY=($(compgen -W '$(perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"')' -- "$cur"));
        else
            COMPREPLY=($(compgen -W '$(cut -d: -f3 /etc/passwd)' -- "$cur"));
        fi;
    fi
}
_upvar () 
{ 
    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;
    if unset -v "$1"; then
        if (($# == 2)); then
            eval $1=\"\$2\";
        else
            eval $1=\(\"\$"{@:2}"\"\);
        fi;
    fi
}
_upvars () 
{ 
    if ! (($#)); then
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;
        return 2;
    fi;
    while (($#)); do
        case $1 in 
            -a*)
                [[ -n ${1#-a} ]] || { 
                    echo "bash_completion: $FUNCNAME:" "\`$1': missing number specifier" 1&gt;&amp;2;
                    return 1
                };
                printf %d "${1#-a}" &amp;&gt; /dev/null || { 
                    echo bash_completion: "$FUNCNAME: \`$1': invalid number specifier" 1&gt;&amp;2;
                    return 1
                };
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\(\"\$"{@:3:${1#-a}}"\"\) &amp;&amp; shift $((${1#-a} + 2)) || { 
                    echo bash_completion: "$FUNCNAME: \`$1${2+ }$2': missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            -v)
                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\"\$3\" &amp;&amp; shift 3 || { 
                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;
                    return 1
                }
            ;;
            *)
                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;
                return 1
            ;;
        esac;
    done
}
_usb_ids () 
{ 
    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk '{print $6}')" -- "$cur"))
}
_user_at_host () 
{ 
    local cur prev words cword;
    _init_completion -n : || return;
    if [[ $cur == *@* ]]; then
        _known_hosts_real "$cur";
    else
        COMPREPLY=($(compgen -u -S @ -- "$cur"));
        compopt -o nospace;
    fi
}
_usergroup () 
{ 
    if [[ $cur == *\\\\* || $cur == *:*:* ]]; then
        return;
    else
        if [[ $cur == *\\:* ]]; then
            local prefix;
            prefix=${cur%%*([^:])};
            prefix=${prefix//\\/};
            local mycur="${cur#*[:]}";
            if [[ ${1-} == -u ]]; then
                _allowed_groups "$mycur";
            else
                local IFS='
';
                COMPREPLY=($(compgen -g -- "$mycur"));
            fi;
            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));
        else
            if [[ $cur == *:* ]]; then
                local mycur="${cur#*:}";
                if [[ ${1-} == -u ]]; then
                    _allowed_groups "$mycur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -g -- "$mycur"));
                fi;
            else
                if [[ ${1-} == -u ]]; then
                    _allowed_users "$cur";
                else
                    local IFS='
';
                    COMPREPLY=($(compgen -u -- "$cur"));
                fi;
            fi;
        fi;
    fi
}
_userland () 
{ 
    local userland=$(uname -s);
    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;
    [[ $userland == "$1" ]]
}
_variable_assignments () 
{ 
    local cur=${1-};
    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
        prev=${BASH_REMATCH[1]};
        cur=${BASH_REMATCH[2]};
    else
        return 1;
    fi;
    case $prev in 
        TZ)
            cur=/usr/share/zoneinfo/$cur;
            _filedir;
            for i in "${!COMPREPLY[@]}";
            do
                if [[ ${COMPREPLY[i]} == *.tab ]]; then
                    unset 'COMPREPLY[i]';
                    continue;
                else
                    if [[ -d ${COMPREPLY[i]} ]]; then
                        COMPREPLY[i]+=/;
                        compopt -o nospace;
                    fi;
                fi;
                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};
            done
        ;;
        TERM)
            _terms
        ;;
        LANG | LC_*)
            COMPREPLY=($(compgen -W '$(locale -a 2&gt;/dev/null)'                 -- "$cur"))
        ;;
        *)
            _variables &amp;&amp; return 0;
            _filedir
        ;;
    esac;
    return 0
}
_variables () 
{ 
    if [[ $cur =~ ^(\$(\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then
        if [[ $cur == '${'* ]]; then
            local arrs vars;
            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]}));
            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]}));
            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then
                compopt -o nospace;
                COMPREPLY+=(${arrs[*]});
            else
                COMPREPLY+=(${vars[*]});
            fi;
        else
            COMPREPLY+=($(compgen -A variable -P '$' -- "${BASH_REMATCH[3]}"));
        fi;
        return 0;
    else
        if [[ $cur =~ ^(\$\{[#!]?)([A-Za-z0-9_]*)\[([^]]*)$ ]]; then
            local IFS='
';
            COMPREPLY+=($(compgen -W '$(printf %s\\n "${!'${BASH_REMATCH[2]}'[@]}")'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}"));
            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then
                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");
            fi;
            __ltrim_colon_completions "$cur";
            return 0;
        else
            if [[ $cur =~ ^\$\{[#!]?[A-Za-z0-9_]*\[.*\]$ ]]; then
                COMPREPLY+=("$cur}");
                __ltrim_colon_completions "$cur";
                return 0;
            fi;
        fi;
    fi;
    return 1
}
_xfunc () 
{ 
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";
    "$@"
}
_xinetd_services () 
{ 
    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};
    if [[ -d $xinetddir ]]; then
        local IFS=' 	
' reset=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($(printf '%s\n' $xinetddir/!($_backup_glob)));
        $reset;
        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W '${svcs[@]#$xinetddir/}' -- "${cur-}"));
    fi
}
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1&gt;&amp;2;
            return 127;
        fi;
    fi
}
dequote () 
{ 
    eval printf %s "$1" 2&gt; /dev/null
}
gawklibpath_append () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$AWKLIBPATH:$*"
}
gawklibpath_default () 
{ 
    unset AWKLIBPATH;
    export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
}
gawklibpath_prepend () 
{ 
    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`;
    export AWKLIBPATH="$*:$AWKLIBPATH"
}
gawkpath_append () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$AWKPATH:$*"
}
gawkpath_default () 
{ 
    unset AWKPATH;
    export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
}
gawkpath_prepend () 
{ 
    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local ret;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<msg time="2026-04-25T23:50:07.475783" level="INFO">${reply} = 

    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git...</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:50:05.833793" elapsed="1.642024"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:50:07.475897" elapsed="0.000056"/>
</return>
<msg time="2026-04-25T23:50:07.476112" level="INFO">${reply} = 

    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git...</msg>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="PASS" start="2026-04-25T23:50:05.619115" elapsed="1.857026"/>
</kw>
<return>
<value>${reply}</value>
<status status="PASS" start="2026-04-25T23:50:07.476190" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:50:07.476358" level="INFO">${actual} = 

    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git...</msg>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="PASS" start="2026-04-25T23:50:05.617718" elapsed="1.858669"/>
</kw>
<kw name="Load_Expected_Reply">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:50:07.477556" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-reply.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-reply.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:50:07.477737" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:50:07.477314" elapsed="0.000452"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:50:07.477812" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:50:07.477964" level="INFO">${expected_reply} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected_reply}</var>
<arg>${name}-reply</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:50:07.476970" elapsed="0.001021"/>
</kw>
<return>
<value>${expected_reply}</value>
<status status="PASS" start="2026-04-25T23:50:07.478034" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:50:07.478181" level="INFO">${expected} = &lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"&gt;
&lt;ok/&gt;
&lt;/rpc-reply&gt;
</msg>
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="PASS" start="2026-04-25T23:50:07.476599" elapsed="0.001608"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-25T23:50:07.478633" level="INFO">${actual} = 

    local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.478353" elapsed="0.000324"/>
</kw>
<kw name="Strip String" owner="String">
<msg time="2026-04-25T23:50:07.479062" level="INFO">${actual} = local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"
}
__git_eread () 
{ 
    test -r "$1" &amp;&amp; IFS='
' read "$2" &lt; "$1"
}
__git_ps1 () ...</msg>
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="PASS" start="2026-04-25T23:50:07.478824" elapsed="0.000267"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<msg time="2026-04-25T23:50:07.480744" level="FAIL">OSError: [Errno 36] File name too long: 'local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"\r\n}\r\n__git_eread () \r\n{ \r\n    test -r "$1" &amp;&amp; IFS=\'\r\r\n\' read "$2" &lt; "$1"\r\n}\r\n__git_ps1 () \r\n{ \r\n    local exit=$?;\r\n    local pcmode=no;\r\n    local detached=no;\r\n    local ps1pc_start=\'\\u@\\h:\\w \';\r\n    local ps1pc_end=\'\\$ \';\r\n    local printf_format=\' (%s)\';\r\n    case "$#" in \r\n        2 | 3)\r\n            pcmode=yes;\r\n            ps1pc_start="$1";\r\n            ps1pc_end="$2";\r\n            printf_format="${3:-$printf_format}";\r\n            PS1="$ps1pc_start$ps1pc_end"\r\n        ;;\r\n        0 | 1)\r\n            printf_format="${1:-$printf_format}"\r\n        ;;\r\n        *)\r\n            return $exit\r\n        ;;\r\n    esac;\r\n    local ps1_expanded=yes;\r\n    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;\r\n    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;\r\n    local repo_info rev_parse_exit_code;\r\n    repo_info="$(git rev-parse --git-dir --is-inside-git-dir \t\t--is-bare-repository --is-inside-work-tree \t\t--short HEAD 2&gt;/dev/null)";\r\n    rev_parse_exit_code="$?";\r\n    if [ -z "$repo_info" ]; then\r\n        return $exit;\r\n    fi;\r\n    local short_sha="";\r\n    if [ "$rev_parse_exit_code" = "0" ]; then\r\n        short_sha="${repo_info##*\r\n}";\r\n        repo_info="${repo_info%\r\n*}";\r\n    fi;\r\n    local inside_worktree="${repo_info##*\r\n}";\r\n    repo_info="${repo_info%\r\n*}";\r\n    local bare_repo="${repo_info##*\r\n}";\r\n    repo_info="${repo_info%\r\n*}";\r\n    local inside_gitdir="${repo_info##*\r\n}";\r\n    local g="${repo_info%\r\n*}";\r\n    if [ "true" = "$inside_worktree" ] &amp;&amp; [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &amp;&amp; [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &amp;&amp; git check-ignore -q .; then\r\n        return $exit;\r\n    fi;\r\n    local sparse="";\r\n    if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n        sparse="|SPARSE";\r\n    fi;\r\n    local r="";\r\n    local b="";\r\n    local step="";\r\n    local total="";\r\n    if [ -d "$g/rebase-merge" ]; then\r\n        __git_eread "$g/rebase-merge/head-name" b;\r\n        __git_eread "$g/rebase-merge/msgnum" step;\r\n        __git_eread "$g/rebase-merge/end" total;\r\n        r="|REBASE";\r\n    else\r\n        if [ -d "$g/rebase-apply" ]; then\r\n            __git_eread "$g/rebase-apply/next" step;\r\n            __git_eread "$g/rebase-apply/last" total;\r\n            if [ -f "$g/rebase-apply/rebasing" ]; then\r\n                __git_eread "$g/rebase-apply/head-name" b;\r\n                r="|REBASE";\r\n            else\r\n                if [ -f "$g/rebase-apply/applying" ]; then\r\n                    r="|AM";\r\n                else\r\n                    r="|AM/REBASE";\r\n                fi;\r\n            fi;\r\n        else\r\n            if [ -f "$g/MERGE_HEAD" ]; then\r\n                r="|MERGING";\r\n            else\r\n                if __git_sequencer_status; then\r\n                    :;\r\n                else\r\n                    if [ -f "$g/BISECT_LOG" ]; then\r\n                        r="|BISECTING";\r\n                    fi;\r\n                fi;\r\n            fi;\r\n        fi;\r\n        if [ -n "$b" ]; then\r\n            :;\r\n        else\r\n            if [ -h "$g/HEAD" ]; then\r\n                b="$(git symbolic-ref HEAD 2&gt;/dev/null)";\r\n            else\r\n                local head="";\r\n                if ! __git_eread "$g/HEAD" head; then\r\n                    return $exit;\r\n                fi;\r\n                b="${head#ref: }";\r\n                if [ "$head" = "$b" ]; then\r\n                    detached=yes;\r\n                    b="$(\r\n\t\t\t\tcase "${GIT_PS1_DESCRIBE_STYLE-}" in\r\n\t\t\t\t(contains)\r\n\t\t\t\t\tgit describe --contains HEAD ;;\r\n\t\t\t\t(branch)\r\n\t\t\t\t\tgit describe --contains --all HEAD ;;\r\n\t\t\t\t(tag)\r\n\t\t\t\t\tgit describe --tags HEAD ;;\r\n\t\t\t\t(describe)\r\n\t\t\t\t\tgit describe HEAD ;;\r\n\t\t\t\t(* | default)\r\n\t\t\t\t\tgit describe --tags --exact-match HEAD ;;\r\n\t\t\t\tesac 2&gt;/dev/null)" || b="$short_sha...";\r\n                    b="($b)";\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    if [ -n "$step" ] &amp;&amp; [ -n "$total" ]; then\r\n        r="$r $step/$total";\r\n    fi;\r\n    local w="";\r\n    local i="";\r\n    local s="";\r\n    local u="";\r\n    local h="";\r\n    local c="";\r\n    local p="";\r\n    if [ "true" = "$inside_gitdir" ]; then\r\n        if [ "true" = "$bare_repo" ]; then\r\n            c="BARE:";\r\n        else\r\n            b="GIT_DIR!";\r\n        fi;\r\n    else\r\n        if [ "true" = "$inside_worktree" ]; then\r\n            if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &amp;&amp; [ "$(git config --bool bash.showDirtyState)" != "false" ]; then\r\n                git diff --no-ext-diff --quiet || w="*";\r\n                git diff --no-ext-diff --cached --quiet || i="+";\r\n                if [ -z "$short_sha" ] &amp;&amp; [ -z "$i" ]; then\r\n                    i="#";\r\n                fi;\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &amp;&amp; git rev-parse --verify --quiet refs/stash &gt; /dev/null; then\r\n                s="$";\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &amp;&amp; [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &amp;&amp; git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- \':/*\' &gt; /dev/null 2&gt; /dev/null; then\r\n                u="%${ZSH_VERSION+%}";\r\n            fi;\r\n            if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &amp;&amp; [ "$(git config --bool core.sparseCheckout)" = "true" ]; then\r\n                h="?";\r\n            fi;\r\n            if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then\r\n                __git_ps1_show_upstream;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    local z="${GIT_PS1_STATESEPARATOR-" "}";\r\n    if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then\r\n        if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then\r\n            __git_ps1_colorize_gitstring;\r\n        fi;\r\n    fi;\r\n    b=${b##refs/heads/};\r\n    if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n        __git_ps1_branch_name=$b;\r\n        b="\\${__git_ps1_branch_name}";\r\n    fi;\r\n    local f="$h$w$i$s$u";\r\n    local gitstring="$c$b${f:+$z$f}${sparse}$r$p";\r\n    if [ $pcmode = yes ]; then\r\n        if [ "${__git_printf_supports_v-}" != yes ]; then\r\n            gitstring=$(printf -- "$printf_format" "$gitstring");\r\n        else\r\n            printf -v gitstring -- "$printf_format" "$gitstring";\r\n        fi;\r\n        PS1="$ps1pc_start$gitstring$ps1pc_end";\r\n    else\r\n        printf -- "$printf_format" "$gitstring";\r\n    fi;\r\n    return $exit\r\n}\r\n__git_ps1_colorize_gitstring () \r\n{ \r\n    if [[ -n ${ZSH_VERSION-} ]]; then\r\n        local c_red=\'%F{red}\';\r\n        local c_green=\'%F{green}\';\r\n        local c_lblue=\'%F{blue}\';\r\n        local c_clear=\'%f\';\r\n    else\r\n        local c_red=\'\\[\\e[31m\\]\';\r\n        local c_green=\'\\[\\e[32m\\]\';\r\n        local c_lblue=\'\\[\\e[1;34m\\]\';\r\n        local c_clear=\'\\[\\e[0m\\]\';\r\n    fi;\r\n    local bad_color=$c_red;\r\n    local ok_color=$c_green;\r\n    local flags_color="$c_lblue";\r\n    local branch_color="";\r\n    if [ $detached = no ]; then\r\n        branch_color="$ok_color";\r\n    else\r\n        branch_color="$bad_color";\r\n    fi;\r\n    c="$branch_color$c";\r\n    z="$c_clear$z";\r\n    if [ "$w" = "*" ]; then\r\n        w="$bad_color$w";\r\n    fi;\r\n    if [ -n "$i" ]; then\r\n        i="$ok_color$i";\r\n    fi;\r\n    if [ -n "$s" ]; then\r\n        s="$flags_color$s";\r\n    fi;\r\n    if [ -n "$u" ]; then\r\n        u="$bad_color$u";\r\n    fi;\r\n    r="$c_clear$r"\r\n}\r\n__git_ps1_show_upstream () \r\n{ \r\n    local key value;\r\n    local svn_remote svn_url_pattern count n;\r\n    local upstream=git legacy="" verbose="" name="";\r\n    svn_remote=();\r\n    local output="$(git config -z --get-regexp \'^(svn-remote\\..*\\.url|bash\\.showupstream)$\' 2&gt;/dev/null | tr \'\\0\\n\' \'\\n \')";\r\n    while read -r key value; do\r\n        case "$key" in \r\n            bash.showupstream)\r\n                GIT_PS1_SHOWUPSTREAM="$value";\r\n                if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then\r\n                    p="";\r\n                    return;\r\n                fi\r\n            ;;\r\n            svn-remote.*.url)\r\n                svn_remote[$((${#svn_remote[@]} + 1))]="$value";\r\n                svn_url_pattern="$svn_url_pattern\\\\|$value";\r\n                upstream=svn+git\r\n            ;;\r\n        esac;\r\n    done &lt;&lt;&lt; "$output";\r\n    local option;\r\n    for option in ${GIT_PS1_SHOWUPSTREAM};\r\n    do\r\n        case "$option" in \r\n            git | svn)\r\n                upstream="$option"\r\n            ;;\r\n            verbose)\r\n                verbose=1\r\n            ;;\r\n            legacy)\r\n                legacy=1\r\n            ;;\r\n            name)\r\n                name=1\r\n            ;;\r\n        esac;\r\n    done;\r\n    case "$upstream" in \r\n        git)\r\n            upstream="@{upstream}"\r\n        ;;\r\n        svn*)\r\n            local -a svn_upstream;\r\n            svn_upstream=($(git log --first-parent -1 \t\t\t\t\t--grep="^git-svn-id: \\(${svn_url_pattern#??}\\)" 2&gt;/dev/null));\r\n            if [[ 0 -ne ${#svn_upstream[@]} ]]; then\r\n                svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]};\r\n                svn_upstream=${svn_upstream%@*};\r\n                local n_stop="${#svn_remote[@]}";\r\n                for ((n=1; n &lt;= n_stop; n++))\r\n                do\r\n                    svn_upstream=${svn_upstream#${svn_remote[$n]}};\r\n                done;\r\n                if [[ -z "$svn_upstream" ]]; then\r\n                    upstream=${GIT_SVN_ID:-git-svn};\r\n                else\r\n                    upstream=${svn_upstream#/};\r\n                fi;\r\n            else\r\n                if [[ "svn+git" = "$upstream" ]]; then\r\n                    upstream="@{upstream}";\r\n                fi;\r\n            fi\r\n        ;;\r\n    esac;\r\n    if [[ -z "$legacy" ]]; then\r\n        count="$(git rev-list --count --left-right \t\t\t\t"$upstream"...HEAD 2&gt;/dev/null)";\r\n    else\r\n        local commits;\r\n        if commits="$(git rev-list --left-right "$upstream"...HEAD 2&gt;/dev/null)"; then\r\n            local commit behind=0 ahead=0;\r\n            for commit in $commits;\r\n            do\r\n                case "$commit" in \r\n                    "&lt;"*)\r\n                        ((behind++))\r\n                    ;;\r\n                    *)\r\n                        ((ahead++))\r\n                    ;;\r\n                esac;\r\n            done;\r\n            count="$behind\t$ahead";\r\n        else\r\n            count="";\r\n        fi;\r\n    fi;\r\n    if [[ -z "$verbose" ]]; then\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p="="\r\n            ;;\r\n            "0\t"*)\r\n                p="&gt;"\r\n            ;;\r\n            *"\t0")\r\n                p="&lt;"\r\n            ;;\r\n            *)\r\n                p="&lt;&gt;"\r\n            ;;\r\n        esac;\r\n    else\r\n        case "$count" in \r\n            "")\r\n                p=""\r\n            ;;\r\n            "0\t0")\r\n                p=" u="\r\n            ;;\r\n            "0\t"*)\r\n                p=" u+${count#0\t}"\r\n            ;;\r\n            *"\t0")\r\n                p=" u-${count%\t0}"\r\n            ;;\r\n            *)\r\n                p=" u+${count#*\t}-${count%\t*}"\r\n            ;;\r\n        esac;\r\n        if [[ -n "$count" &amp;&amp; -n "$name" ]]; then\r\n            __git_ps1_upstream_name=$(git rev-parse \t\t\t\t--abbrev-ref "$upstream" 2&gt;/dev/null);\r\n            if [ $pcmode = yes ] &amp;&amp; [ $ps1_expanded = yes ]; then\r\n                p="$p \\${__git_ps1_upstream_name}";\r\n            else\r\n                p="$p ${__git_ps1_upstream_name}";\r\n                unset __git_ps1_upstream_name;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n__git_sequencer_status () \r\n{ \r\n    local todo;\r\n    if test -f "$g/CHERRY_PICK_HEAD"; then\r\n        r="|CHERRY-PICKING";\r\n        return 0;\r\n    else\r\n        if test -f "$g/REVERT_HEAD"; then\r\n            r="|REVERTING";\r\n            return 0;\r\n        else\r\n            if __git_eread "$g/sequencer/todo" todo; then\r\n                case "$todo" in \r\n                    p[\\ \\\t] | pick[\\ \\\t]*)\r\n                        r="|CHERRY-PICKING";\r\n                        return 0\r\n                    ;;\r\n                    revert[\\ \\\t]*)\r\n                        r="|REVERTING";\r\n                        return 0\r\n                    ;;\r\n                esac;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n__load_completion () \r\n{ \r\n    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);\r\n    local ifs=$IFS IFS=: dir cmd="${1##*/}" compfile;\r\n    [[ -n $cmd ]] || return 1;\r\n    for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share};\r\n    do\r\n        dirs+=($dir/bash-completion/completions);\r\n    done;\r\n    IFS=$ifs;\r\n    if [[ $BASH_SOURCE == */* ]]; then\r\n        dirs+=("${BASH_SOURCE%/*}/completions");\r\n    else\r\n        dirs+=(./completions);\r\n    fi;\r\n    local backslash=;\r\n    if [[ $cmd == \\\\* ]]; then\r\n        cmd="${cmd:1}";\r\n        $(complete -p "$cmd" 2&gt;/dev/null || echo false) "\\\\$cmd" &amp;&amp; return 0;\r\n        backslash=\\\\;\r\n    fi;\r\n    for dir in "${dirs[@]}";\r\n    do\r\n        [[ -d $dir ]] || continue;\r\n        for compfile in "$cmd" "$cmd.bash" "_$cmd";\r\n        do\r\n            compfile="$dir/$compfile";\r\n            if [[ -f $compfile ]] &amp;&amp; . "$compfile" &amp;&gt; /dev/null; then\r\n                [[ -n $backslash ]] &amp;&amp; $(complete -p "$cmd") "\\\\$cmd";\r\n                return 0;\r\n            fi;\r\n        done;\r\n    done;\r\n    [[ -v _xspecs[$cmd] ]] &amp;&amp; complete -F _filedir_xspec "$cmd" "$backslash$cmd" &amp;&amp; return 0;\r\n    return 1\r\n}\r\n__ltrim_colon_completions () \r\n{ \r\n    if [[ $1 == *:* &amp;&amp; $COMP_WORDBREAKS == *:* ]]; then\r\n        local colon_word=${1%"${1##*:}"};\r\n        local i=${#COMPREPLY[*]};\r\n        while ((i-- &gt; 0)); do\r\n            COMPREPLY[i]=${COMPREPLY[i]#"$colon_word"};\r\n        done;\r\n    fi\r\n}\r\n__parse_options () \r\n{ \r\n    local option option2 i IFS=\' \t\r\n,/|\';\r\n    option=;\r\n    local -a array=($1);\r\n    for i in "${array[@]}";\r\n    do\r\n        case "$i" in \r\n            ---*)\r\n                break\r\n            ;;\r\n            --?*)\r\n                option=$i;\r\n                break\r\n            ;;\r\n            -?*)\r\n                [[ -n $option ]] || option=$i\r\n            ;;\r\n            *)\r\n                break\r\n            ;;\r\n        esac;\r\n    done;\r\n    [[ -n $option ]] || return 0;\r\n    IFS=\' \t\r\n\';\r\n    if [[ $option =~ (\\[((no|dont)-?)\\]). ]]; then\r\n        option2=${option/"${BASH_REMATCH[1]}"/};\r\n        option2=${option2%%[&lt;{().[]*};\r\n        printf \'%s\\n\' "${option2/=*/=}";\r\n        option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"};\r\n    fi;\r\n    option=${option%%[&lt;{().[]*};\r\n    printf \'%s\\n\' "${option/=*/=}"\r\n}\r\n__reassemble_comp_words_by_ref () \r\n{ \r\n    local exclude i j line ref;\r\n    if [[ -n $1 ]]; then\r\n        exclude="[${1//[^$COMP_WORDBREAKS]/}]";\r\n    fi;\r\n    printf -v "$3" %s "$COMP_CWORD";\r\n    if [[ -v exclude ]]; then\r\n        line=$COMP_LINE;\r\n        for ((i = 0, j = 0; i &lt; ${#COMP_WORDS[@]}; i++, j++))\r\n        do\r\n            while [[ $i -gt 0 &amp;&amp; ${COMP_WORDS[i]} == +($exclude) ]]; do\r\n                [[ $line != [[:blank:]]* ]] &amp;&amp; ((j &gt;= 2)) &amp;&amp; ((j--));\r\n                ref="$2[$j]";\r\n                printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n                ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n                line=${line#*"${COMP_WORDS[i]}"};\r\n                [[ $line == [[:blank:]]* ]] &amp;&amp; ((j++));\r\n                ((i &lt; ${#COMP_WORDS[@]} - 1)) &amp;&amp; ((i++)) || break 2;\r\n            done;\r\n            ref="$2[$j]";\r\n            printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}";\r\n            line=${line#*"${COMP_WORDS[i]}"};\r\n            ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n        done;\r\n        ((i == COMP_CWORD)) &amp;&amp; printf -v "$3" %s "$j";\r\n    else\r\n        for i in "${!COMP_WORDS[@]}";\r\n        do\r\n            printf -v "$2[i]" %s "${COMP_WORDS[i]}";\r\n        done;\r\n    fi\r\n}\r\n_allowed_groups () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -g -- "$1"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -Gn 2&gt;/dev/null || groups 2&gt;/dev/null)" -- "$1"));\r\n    fi\r\n}\r\n_allowed_users () \r\n{ \r\n    if _complete_as_root; then\r\n        local IFS=\'\r\n\';\r\n        COMPREPLY=($(compgen -u -- "${1:-$cur}"));\r\n    else\r\n        local IFS=\'\r\n \';\r\n        COMPREPLY=($(compgen -W             "$(id -un 2&gt;/dev/null || whoami 2&gt;/dev/null)" -- "${1:-$cur}"));\r\n    fi\r\n}\r\n_apport-bug () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        ubuntu-bug | apport-bug)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions="--tag";\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-cli () \r\n{ \r\n    local cur dashoptions prev param;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    dashoptions=\'-h --help -f --file-bug -u --update-bug -s --symptom \\\r\n                 -c --crash-file --save -v --version --tag -w --window\';\r\n    case "$prev" in \r\n        apport-cli)\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n        -f | --file-bug)\r\n            param="-P --pid -p --package -s --symptom";\r\n            COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        -s | --symptom)\r\n            COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur))\r\n        ;;\r\n        --save)\r\n            COMPREPLY=($( compgen -o default -G "$cur*" ))\r\n        ;;\r\n        -c | --crash-file)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n        -w | --window)\r\n            dashoptions="--save --tag";\r\n            COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n        ;;\r\n        -h | --help | -v | --version | --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            dashoptions=\'--tag\';\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--save.* ]]; then\r\n                dashoptions="--save $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--window.* || "${COMP_WORDS[*]}" =~ .*\\ -w\\ .* ]]; then\r\n                dashoptions="-w --window $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--symptom.* || "${COMP_WORDS[*]}" =~ .*\\ -s\\ .* ]]; then\r\n                dashoptions="-s --symptom $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--update.* || "${COMP_WORDS[*]}" =~ .*\\ -u\\ .* ]]; then\r\n                dashoptions="-u --update $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--file-bug.* || "${COMP_WORDS[*]}" =~ .*\\ -f\\ .* ]]; then\r\n                dashoptions="-f --file-bug $dashoptions";\r\n            fi;\r\n            if ! [[ "${COMP_WORDS[*]}" =~ .*--crash-file.* || "${COMP_WORDS[*]}" =~ .*\\ -c\\ .* ]]; then\r\n                dashoptions="-c --crash-file $dashoptions";\r\n            fi;\r\n            case "$cur" in \r\n                -*)\r\n                    COMPREPLY=($( compgen -W "$dashoptions" -- $cur ))\r\n                ;;\r\n                *)\r\n                    _apport_parameterless\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac\r\n}\r\n_apport-collect () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-collect)\r\n            COMPREPLY=($( compgen -W "-p --package --tag" -- $cur))\r\n        ;;\r\n        -p | --package)\r\n            COMPREPLY=($( apt-cache pkgnames $cur 2&gt; /dev/null ))\r\n        ;;\r\n        --tag)\r\n            return 0\r\n        ;;\r\n        *)\r\n            if [[ "${COMP_WORDS[*]}" =~ .*\\ -p.* || "${COMP_WORDS[*]}" =~ .*--package.* ]]; then\r\n                COMPREPLY=($( compgen -W "--tag" -- $cur));\r\n            else\r\n                COMPREPLY=($( compgen -W "-p --package --tag" -- $cur));\r\n            fi\r\n        ;;\r\n    esac\r\n}\r\n_apport-unpack () \r\n{ \r\n    local cur prev;\r\n    COMPREPLY=();\r\n    cur=`_get_cword`;\r\n    prev=${COMP_WORDS[COMP_CWORD-1]};\r\n    case "$prev" in \r\n        apport-unpack)\r\n            COMPREPLY=($( compgen -G "${cur}*.apport"\r\n                       compgen -G "${cur}*.crash" ))\r\n        ;;\r\n    esac\r\n}\r\n_apport_parameterless () \r\n{ \r\n    local param;\r\n    param="$dashoptions            $( apt-cache pkgnames $cur 2&gt; /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";\r\n    COMPREPLY=($( compgen -W "$param" -- $cur))\r\n}\r\n_apport_symptoms () \r\n{ \r\n    local syms;\r\n    if [ -r /usr/share/apport/symptoms ]; then\r\n        for FILE in $(ls /usr/share/apport/symptoms);\r\n        do\r\n            if [[ ! "$FILE" =~ ^_.* &amp;&amp; -n $(egrep "^def run\\s*\\(.*\\):" /usr/share/apport/symptoms/$FILE) ]]; then\r\n                syms="$syms ${FILE%.py}";\r\n            fi;\r\n        done;\r\n    fi;\r\n    echo $syms\r\n}\r\n_available_interfaces () \r\n{ \r\n    local PATH=$PATH:/sbin;\r\n    COMPREPLY=($({\r\n        if [[ ${1:-} == -w ]]; then\r\n            iwconfig\r\n        elif [[ ${1:-} == -a ]]; then\r\n            ifconfig || ip link show up\r\n        else\r\n            ifconfig -a || ip link show\r\n        fi\r\n    } 2&gt;/dev/null | awk         \'/^[^ \\t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }\'));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]/%[[:punct:]]/}\' -- "$cur"))\r\n}\r\n_bashcomp_try_faketty () \r\n{ \r\n    if type unbuffer &amp;&gt; /dev/null; then\r\n        unbuffer -p "$@";\r\n    else\r\n        if script --version 2&gt;&amp;1 | command grep -qF util-linux; then\r\n            script -qaefc "$*" /dev/null;\r\n        else\r\n            "$@";\r\n        fi;\r\n    fi\r\n}\r\n_cd () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    local IFS=\'\r\n\' i j k;\r\n    compopt -o filenames;\r\n    if [[ -z ${CDPATH:-} || $cur == ?(.)?(.)/* ]]; then\r\n        _filedir -d;\r\n        return;\r\n    fi;\r\n    local -r mark_dirs=$(_rl_enabled mark-directories &amp;&amp; echo y);\r\n    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories &amp;&amp; echo y);\r\n    for i in ${CDPATH//:/\'\r\n\'};\r\n    do\r\n        k="${#COMPREPLY[@]}";\r\n        for j in $(compgen -d -- $i/$cur);\r\n        do\r\n            if [[ ( -n $mark_symdirs &amp;&amp; -L $j || -n $mark_dirs &amp;&amp; ! -L $j ) &amp;&amp; ! -d ${j#$i/} ]]; then\r\n                j+="/";\r\n            fi;\r\n            COMPREPLY[k++]=${j#$i/};\r\n        done;\r\n    done;\r\n    _filedir -d;\r\n    if ((${#COMPREPLY[@]} == 1)); then\r\n        i=${COMPREPLY[0]};\r\n        if [[ $i == "$cur" &amp;&amp; $i != "*/" ]]; then\r\n            COMPREPLY[0]="${i}/";\r\n        fi;\r\n    fi;\r\n    return\r\n}\r\n_cd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?([amrs])cd*" -- "${cur:-/dev/}"))\r\n}\r\n_command () \r\n{ \r\n    local offset i;\r\n    offset=1;\r\n    for ((i = 1; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            offset=$i;\r\n            break;\r\n        fi;\r\n    done;\r\n    _command_offset $offset\r\n}\r\n_command_offset () \r\n{ \r\n    local word_offset=$1 i j;\r\n    for ((i = 0; i &lt; word_offset; i++))\r\n    do\r\n        for ((j = 0; j &lt;= ${#COMP_LINE}; j++))\r\n        do\r\n            [[ $COMP_LINE == "${COMP_WORDS[i]}"* ]] &amp;&amp; break;\r\n            COMP_LINE=${COMP_LINE:1};\r\n            ((COMP_POINT--));\r\n        done;\r\n        COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"};\r\n        ((COMP_POINT -= ${#COMP_WORDS[i]}));\r\n    done;\r\n    for ((i = 0; i &lt;= COMP_CWORD - word_offset; i++))\r\n    do\r\n        COMP_WORDS[i]=${COMP_WORDS[i + word_offset]};\r\n    done;\r\n    for ((i; i &lt;= COMP_CWORD; i++))\r\n    do\r\n        unset \'COMP_WORDS[i]\';\r\n    done;\r\n    ((COMP_CWORD -= word_offset));\r\n    COMPREPLY=();\r\n    local cur;\r\n    _get_comp_words_by_ref cur;\r\n    if ((COMP_CWORD == 0)); then\r\n        local IFS=\'\r\n\';\r\n        compopt -o filenames;\r\n        COMPREPLY=($(compgen -d -c -- "$cur"));\r\n    else\r\n        local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]};\r\n        local cspec=$(complete -p $cmd 2&gt;/dev/null);\r\n        if [[ ! -n $cspec &amp;&amp; $cmd == */* ]]; then\r\n            cspec=$(complete -p ${cmd##*/} 2&gt;/dev/null);\r\n            [[ -n $cspec ]] &amp;&amp; compcmd=${cmd##*/};\r\n        fi;\r\n        if [[ ! -n $cspec ]]; then\r\n            compcmd=${cmd##*/};\r\n            _completion_loader $compcmd;\r\n            cspec=$(complete -p $compcmd 2&gt;/dev/null);\r\n        fi;\r\n        if [[ -n $cspec ]]; then\r\n            if [[ ${cspec#* -F } != "$cspec" ]]; then\r\n                local func=${cspec#*-F };\r\n                func=${func%% *};\r\n                if ((${#COMP_WORDS[@]} &gt;= 2)); then\r\n                    $func $cmd "${COMP_WORDS[-1]}" "${COMP_WORDS[-2]}";\r\n                else\r\n                    $func $cmd "${COMP_WORDS[-1]}";\r\n                fi;\r\n                local opt;\r\n                while [[ $cspec == *" -o "* ]]; do\r\n                    cspec=${cspec#*-o };\r\n                    opt=${cspec%% *};\r\n                    compopt -o $opt;\r\n                    cspec=${cspec#$opt};\r\n                done;\r\n            else\r\n                cspec=${cspec#complete};\r\n                cspec=${cspec%%$compcmd};\r\n                COMPREPLY=($(eval compgen "$cspec" -- \'$cur\'));\r\n            fi;\r\n        else\r\n            if ((${#COMPREPLY[@]} == 0)); then\r\n                _minimal;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_complete_as_root () \r\n{ \r\n    [[ $EUID -eq 0 || -n ${root_command:-} ]]\r\n}\r\n_completion_loader () \r\n{ \r\n    local cmd="${1:-_EmptycmD_}";\r\n    __load_completion "$cmd" &amp;&amp; return 124;\r\n    complete -F _minimal -- "$cmd" &amp;&amp; return 124\r\n}\r\n_configured_interfaces () \r\n{ \r\n    if [[ -f /etc/debian_version ]]; then\r\n        COMPREPLY=($(compgen -W "$(command sed -ne \'s|^iface \\([^ ]\\{1,\\}\\).*$|\\1|p\'             /etc/network/interfaces /etc/network/interfaces.d/* 2&gt;/dev/null)"             -- "$cur"));\r\n    else\r\n        if [[ -f /etc/SuSE-release ]]; then\r\n            COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n        else\r\n            if [[ -f /etc/pld-release ]]; then\r\n                COMPREPLY=($(compgen -W "$(command ls -B             /etc/sysconfig/interfaces |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            else\r\n                COMPREPLY=($(compgen -W "$(printf \'%s\\n\'             /etc/sysconfig/network-scripts/ifcfg-* |\r\n            command sed -ne \'s|.*ifcfg-\\([^*].*\\)$|\\1|p\')" -- "$cur"));\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_count_args () \r\n{ \r\n    local i cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    args=1;\r\n    for ((i = 1; i &lt; cword; i++))\r\n    do\r\n        if [[ ${words[i]} != -* &amp;&amp; ${words[i - 1]} != ${2-} || ${words[i]} == ${3-} ]]; then\r\n            ((args++));\r\n        fi;\r\n    done\r\n}\r\n_dvd_devices () \r\n{ \r\n    COMPREPLY+=($(compgen -f -d -X "!*/?(r)dvd*" -- "${cur:-/dev/}"))\r\n}\r\n_expand () \r\n{ \r\n    case ${cur-} in \r\n        ~*/*)\r\n            __expand_tilde_by_ref cur\r\n        ;;\r\n        ~*)\r\n            _tilde "$cur" || eval COMPREPLY[0]="$(printf ~%q "${COMPREPLY[0]#\\~}")";\r\n            return ${#COMPREPLY[@]}\r\n        ;;\r\n    esac\r\n}\r\n_filedir () \r\n{ \r\n    local IFS=\'\r\n\';\r\n    _tilde "${cur-}" || return;\r\n    local -a toks;\r\n    local reset arg=${1-};\r\n    if [[ $arg == -d ]]; then\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks=($(compgen -d -- "${cur-}"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n    else\r\n        local quoted;\r\n        _quote_readline_by_ref "${cur-}" quoted;\r\n        local xspec=${arg:+"!*.@($arg|${arg^^})"} plusdirs=();\r\n        local opts=(-f -X "$xspec");\r\n        [[ -n $xspec ]] &amp;&amp; plusdirs=(-o plusdirs);\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} || -z ${plusdirs-} ]] || opts+=("${plusdirs[@]}");\r\n        reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen "${opts[@]}" -- $quoted));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\';\r\n        [[ -n ${COMP_FILEDIR_FALLBACK-} &amp;&amp; -n $arg &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n            reset=$(shopt -po noglob);\r\n            set -o noglob;\r\n            toks+=($(compgen -f ${plusdirs+"${plusdirs[@]}"} -- $quoted));\r\n            IFS=\' \';\r\n            $reset;\r\n            IFS=\'\r\n\'\r\n        };\r\n    fi;\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames 2&gt; /dev/null;\r\n        COMPREPLY+=("${toks[@]}");\r\n    fi\r\n}\r\n_filedir_xspec () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    _tilde "$cur" || return;\r\n    local IFS=\'\r\n\' xspec=${_xspecs[${1##*/}]} tmp;\r\n    local -a toks;\r\n    toks=($(\r\n        compgen -d -- "$(quote_readline "$cur")" | {\r\n            while read -r tmp; do\r\n                printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    eval xspec="${xspec}";\r\n    local matchop=!;\r\n    if [[ $xspec == !* ]]; then\r\n        xspec=${xspec#!};\r\n        matchop=@;\r\n    fi;\r\n    xspec="$matchop($xspec|${xspec^^})";\r\n    toks+=($(\r\n        eval compgen -f -X "\'!$xspec\'" -- \'$(quote_readline "$cur")\' | {\r\n            while read -r tmp; do\r\n                [[ -n $tmp ]] &amp;&amp; printf \'%s\\n\' $tmp\r\n            done\r\n        }\r\n    ));\r\n    [[ -n ${COMP_FILEDIR_FALLBACK:-} &amp;&amp; ${#toks[@]} -lt 1 ]] &amp;&amp; { \r\n        local reset=$(shopt -po noglob);\r\n        set -o noglob;\r\n        toks+=($(compgen -f -- "$(quote_readline "$cur")"));\r\n        IFS=\' \';\r\n        $reset;\r\n        IFS=\'\r\n\'\r\n    };\r\n    if ((${#toks[@]} != 0)); then\r\n        compopt -o filenames;\r\n        COMPREPLY=("${toks[@]}");\r\n    fi\r\n}\r\n_fstypes () \r\n{ \r\n    local fss;\r\n    if [[ -e /proc/filesystems ]]; then\r\n        fss="$(cut -d\'\t\' -f2 /proc/filesystems)\r\n             $(awk \'! /\\*/ { print $NF }\' /etc/filesystems 2&gt;/dev/null)";\r\n    else\r\n        fss="$(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/fstab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $3 }\' /etc/mnttab 2&gt;/dev/null)\r\n             $(awk \'/^[ \\t]*[^#]/ { print $4 }\' /etc/vfstab 2&gt;/dev/null)\r\n             $(awk \'{ print $1 }\' /etc/dfs/fstypes 2&gt;/dev/null)\r\n             $([[ -d /etc/fs ]] &amp;&amp; command ls /etc/fs)";\r\n    fi;\r\n    [[ -n $fss ]] &amp;&amp; COMPREPLY+=($(compgen -W "$fss" -- "$cur"))\r\n}\r\n_get_comp_words_by_ref () \r\n{ \r\n    local exclude flag i OPTIND=1;\r\n    local cur cword words=();\r\n    local upargs=() upvars=() vcur vcword vprev vwords;\r\n    while getopts "c:i:n:p:w:" flag "$@"; do\r\n        case $flag in \r\n            c)\r\n                vcur=$OPTARG\r\n            ;;\r\n            i)\r\n                vcword=$OPTARG\r\n            ;;\r\n            n)\r\n                exclude=$OPTARG\r\n            ;;\r\n            p)\r\n                vprev=$OPTARG\r\n            ;;\r\n            w)\r\n                vwords=$OPTARG\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    while [[ $# -ge $OPTIND ]]; do\r\n        case ${!OPTIND} in \r\n            cur)\r\n                vcur=cur\r\n            ;;\r\n            prev)\r\n                vprev=prev\r\n            ;;\r\n            cword)\r\n                vcword=cword\r\n            ;;\r\n            words)\r\n                vwords=words\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: \\`${!OPTIND}\':" "unknown argument" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n        ((OPTIND += 1));\r\n    done;\r\n    __get_cword_at_cursor_by_ref "${exclude-}" words cword cur;\r\n    [[ -v vcur ]] &amp;&amp; { \r\n        upvars+=("$vcur");\r\n        upargs+=(-v $vcur "$cur")\r\n    };\r\n    [[ -v vcword ]] &amp;&amp; { \r\n        upvars+=("$vcword");\r\n        upargs+=(-v $vcword "$cword")\r\n    };\r\n    [[ -v vprev &amp;&amp; $cword -ge 1 ]] &amp;&amp; { \r\n        upvars+=("$vprev");\r\n        upargs+=(-v $vprev "${words[cword - 1]}")\r\n    };\r\n    [[ -v vwords ]] &amp;&amp; { \r\n        upvars+=("$vwords");\r\n        upargs+=(-a${#words[@]} $vwords ${words+"${words[@]}"})\r\n    };\r\n    ((${#upvars[@]})) &amp;&amp; local "${upvars[@]}" &amp;&amp; _upvars "${upargs[@]}"\r\n}\r\n_get_cword () \r\n{ \r\n    local LC_CTYPE=C;\r\n    local cword words;\r\n    __reassemble_comp_words_by_ref "${1-}" words cword;\r\n    if [[ -n ${2-} &amp;&amp; -n ${2//[^0-9]/} ]]; then\r\n        printf "%s" "${words[cword - $2]}";\r\n    else\r\n        if ((${#words[cword]} == 0 &amp;&amp; COMP_POINT == ${#COMP_LINE})); then\r\n            :;\r\n        else\r\n            local i;\r\n            local cur="$COMP_LINE";\r\n            local index="$COMP_POINT";\r\n            for ((i = 0; i &lt;= cword; ++i))\r\n            do\r\n                while [[ ${#cur} -ge ${#words[i]} &amp;&amp; ${cur:0:${#words[i]}} != "${words[i]}" ]]; do\r\n                    cur="${cur:1}";\r\n                    ((index &gt; 0)) &amp;&amp; ((index--));\r\n                done;\r\n                if ((i &lt; cword)); then\r\n                    local old_size="${#cur}";\r\n                    cur="${cur#${words[i]}}";\r\n                    local new_size="${#cur}";\r\n                    ((index -= old_size - new_size));\r\n                fi;\r\n            done;\r\n            if [[ ${words[cword]:0:${#cur}} != "$cur" ]]; then\r\n                printf "%s" "${words[cword]}";\r\n            else\r\n                printf "%s" "${cur:0:index}";\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_get_first_arg () \r\n{ \r\n    local i;\r\n    arg=;\r\n    for ((i = 1; i &lt; COMP_CWORD; i++))\r\n    do\r\n        if [[ ${COMP_WORDS[i]} != -* ]]; then\r\n            arg=${COMP_WORDS[i]};\r\n            break;\r\n        fi;\r\n    done\r\n}\r\n_get_pword () \r\n{ \r\n    if ((COMP_CWORD &gt;= 1)); then\r\n        _get_cword "${@:-}" 1;\r\n    fi\r\n}\r\n_gids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent group | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($gid) = (getgrent)[2]) { print $gid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/group)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_have () \r\n{ \r\n    PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &amp;&gt; /dev/null\r\n}\r\n_included_ssh_config_files () \r\n{ \r\n    (($# &lt; 1)) &amp;&amp; echo "bash_completion: $FUNCNAME: missing mandatory argument CONFIG" 1&gt;&amp;2;\r\n    local configfile i f;\r\n    configfile=$1;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    local included=($(command sed -ne \'s/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\\(.*\\)$/\\1/p\' "${configfile}"));\r\n    $reset;\r\n    [[ -n ${included-} ]] || return;\r\n    for i in "${included[@]}";\r\n    do\r\n        if ! [[ $i =~ ^\\~.*|^\\/.* ]]; then\r\n            if [[ $configfile =~ ^\\/etc\\/ssh.* ]]; then\r\n                i="/etc/ssh/$i";\r\n            else\r\n                i="$HOME/.ssh/$i";\r\n            fi;\r\n        fi;\r\n        __expand_tilde_by_ref i;\r\n        set +o noglob;\r\n        for f in $i;\r\n        do\r\n            if [[ -r $f ]]; then\r\n                config+=("$f");\r\n                _included_ssh_config_files $f;\r\n            fi;\r\n        done;\r\n        $reset;\r\n    done\r\n}\r\n_init_completion () \r\n{ \r\n    local exclude="" flag outx errx inx OPTIND=1;\r\n    while getopts "n:e:o:i:s" flag "$@"; do\r\n        case $flag in \r\n            n)\r\n                exclude+=$OPTARG\r\n            ;;\r\n            e)\r\n                errx=$OPTARG\r\n            ;;\r\n            o)\r\n                outx=$OPTARG\r\n            ;;\r\n            i)\r\n                inx=$OPTARG\r\n            ;;\r\n            s)\r\n                split=false;\r\n                exclude+==\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    COMPREPLY=();\r\n    local redir="@(?([0-9])&lt;|?([0-9&amp;])&gt;?(&gt;)|&gt;&amp;)";\r\n    _get_comp_words_by_ref -n "$exclude&lt;&gt;&amp;" cur prev words cword;\r\n    _variables &amp;&amp; return 1;\r\n    if [[ $cur == $redir* || ${prev-} == $redir ]]; then\r\n        local xspec;\r\n        case $cur in \r\n            2\'&gt;\'*)\r\n                xspec=${errx-}\r\n            ;;\r\n            *\'&gt;\'*)\r\n                xspec=${outx-}\r\n            ;;\r\n            *\'&lt;\'*)\r\n                xspec=${inx-}\r\n            ;;\r\n            *)\r\n                case $prev in \r\n                    2\'&gt;\'*)\r\n                        xspec=${errx-}\r\n                    ;;\r\n                    *\'&gt;\'*)\r\n                        xspec=${outx-}\r\n                    ;;\r\n                    *\'&lt;\'*)\r\n                        xspec=${inx-}\r\n                    ;;\r\n                esac\r\n            ;;\r\n        esac;\r\n        cur="${cur##$redir}";\r\n        _filedir $xspec;\r\n        return 1;\r\n    fi;\r\n    local i skip;\r\n    for ((i = 1; i &lt; ${#words[@]}; 1))\r\n    do\r\n        if [[ ${words[i]} == $redir* ]]; then\r\n            [[ ${words[i]} == $redir ]] &amp;&amp; skip=2 || skip=1;\r\n            words=("${words[@]:0:i}" "${words[@]:i+skip}");\r\n            ((i &lt;= cword)) &amp;&amp; ((cword -= skip));\r\n        else\r\n            ((i++));\r\n        fi;\r\n    done;\r\n    ((cword &lt;= 0)) &amp;&amp; return 1;\r\n    prev=${words[cword - 1]};\r\n    [[ -n ${split-} ]] &amp;&amp; _split_longopt &amp;&amp; split=true;\r\n    return 0\r\n}\r\n_installed_modules () \r\n{ \r\n    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |\r\n        awk \'{if (NR != 1) print $1}\')" -- "$1"))\r\n}\r\n_ip_addresses () \r\n{ \r\n    local n;\r\n    case ${1-} in \r\n        -a)\r\n            n=\'6\\?\'\r\n        ;;\r\n        -6)\r\n            n=\'6\'\r\n        ;;\r\n        *)\r\n            n=\r\n        ;;\r\n    esac;\r\n    local PATH=$PATH:/sbin;\r\n    local addrs=$({\r\n        LC_ALL=C ifconfig -a || ip addr show\r\n    } 2&gt;/dev/null |\r\n        command sed -e \'s/[[:space:]]addr:/ /\' -ne             "s|.*inet${n}[[:space:]]\\{1,\\}\\([^[:space:]/]*\\).*|\\1|p");\r\n    COMPREPLY+=($(compgen -W "$addrs" -- "${cur-}"))\r\n}\r\n_kernel_versions () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ls /lib/modules)\' -- "$cur"))\r\n}\r\n_known_hosts () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    local options;\r\n    [[ ${1-} == -a || ${2-} == -a ]] &amp;&amp; options=-a;\r\n    [[ ${1-} == -c || ${2-} == -c ]] &amp;&amp; options+=" -c";\r\n    _known_hosts_real ${options-} -- "$cur"\r\n}\r\n_known_hosts_real () \r\n{ \r\n    local configfile flag prefix="" ifs=$IFS;\r\n    local cur suffix="" aliases i host ipv4 ipv6;\r\n    local -a kh tmpkh=() khd=() config=();\r\n    local OPTIND=1;\r\n    while getopts "ac46F:p:" flag "$@"; do\r\n        case $flag in \r\n            a)\r\n                aliases=\'yes\'\r\n            ;;\r\n            c)\r\n                suffix=\':\'\r\n            ;;\r\n            F)\r\n                configfile=$OPTARG\r\n            ;;\r\n            p)\r\n                prefix=$OPTARG\r\n            ;;\r\n            4)\r\n                ipv4=1\r\n            ;;\r\n            6)\r\n                ipv6=1\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: usage error" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done;\r\n    if (($# &lt; OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME: missing mandatory argument CWORD" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    cur=${!OPTIND};\r\n    ((OPTIND += 1));\r\n    if (($# &gt;= OPTIND)); then\r\n        echo "bash_completion: $FUNCNAME($*): unprocessed arguments:" "$(while (($# &gt;= OPTIND)); do\r\n                printf \'%s \' ${!OPTIND}\r\n                shift\r\n            done)" 1&gt;&amp;2;\r\n        return 1;\r\n    fi;\r\n    [[ $cur == *@* ]] &amp;&amp; prefix=$prefix${cur%@*}@ &amp;&amp; cur=${cur#*@};\r\n    kh=();\r\n    if [[ -v configfile ]]; then\r\n        [[ -r $configfile ]] &amp;&amp; config+=("$configfile");\r\n    else\r\n        for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; config+=("$i");\r\n        done;\r\n    fi;\r\n    local reset=$(shopt -po noglob);\r\n    set -o noglob;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        for i in "${config[@]}";\r\n        do\r\n            _included_ssh_config_files "$i";\r\n        done;\r\n    fi;\r\n    if ((${#config[@]} &gt; 0)); then\r\n        local IFS=\'\r\n\';\r\n        tmpkh=($(awk \'sub("^[ \\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \\t]+", "") { print $0 }\' "${config[@]}" | sort -u));\r\n        IFS=$ifs;\r\n    fi;\r\n    if ((${#tmpkh[@]} != 0)); then\r\n        local j;\r\n        for i in "${tmpkh[@]}";\r\n        do\r\n            while [[ $i =~ ^([^\\"]*)\\"([^\\"]*)\\"(.*)$ ]]; do\r\n                i=${BASH_REMATCH[1]}${BASH_REMATCH[3]};\r\n                j=${BASH_REMATCH[2]};\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n            for j in $i;\r\n            do\r\n                __expand_tilde_by_ref j;\r\n                [[ -r $j ]] &amp;&amp; kh+=("$j");\r\n            done;\r\n        done;\r\n    fi;\r\n    if [[ ! -v configfile ]]; then\r\n        for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2;\r\n        do\r\n            [[ -r $i ]] &amp;&amp; kh+=("$i");\r\n        done;\r\n        for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys;\r\n        do\r\n            [[ -d $i ]] &amp;&amp; khd+=("$i"/*pub);\r\n        done;\r\n    fi;\r\n    if ((${#kh[@]} + ${#khd[@]} &gt; 0)); then\r\n        if ((${#kh[@]} &gt; 0)); then\r\n            for i in "${kh[@]}";\r\n            do\r\n                while read -ra tmpkh; do\r\n                    ((${#tmpkh[@]} == 0)) &amp;&amp; continue;\r\n                    set -- "${tmpkh[@]}";\r\n                    [[ $1 == [\\|\\#]* ]] &amp;&amp; continue;\r\n                    [[ $1 == @* ]] &amp;&amp; shift;\r\n                    local IFS=,;\r\n                    for host in $1;\r\n                    do\r\n                        [[ $host == *[*?]* ]] &amp;&amp; continue;\r\n                        host="${host#[}";\r\n                        host="${host%]?(:+([0-9]))}";\r\n                        COMPREPLY+=($host);\r\n                    done;\r\n                    IFS=$ifs;\r\n                done &lt; "$i";\r\n            done;\r\n            COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n        fi;\r\n        if ((${#khd[@]} &gt; 0)); then\r\n            for i in "${khd[@]}";\r\n            do\r\n                if [[ $i == *key_22_$cur*.pub &amp;&amp; -r $i ]]; then\r\n                    host=${i/#*key_22_/};\r\n                    host=${host/%.pub/};\r\n                    COMPREPLY+=($host);\r\n                fi;\r\n            done;\r\n        fi;\r\n        for i in ${!COMPREPLY[*]};\r\n        do\r\n            COMPREPLY[i]=$prefix${COMPREPLY[i]}$suffix;\r\n        done;\r\n    fi;\r\n    if [[ ${#config[@]} -gt 0 &amp;&amp; -v aliases ]]; then\r\n        local -a hosts=($(command sed -ne \'s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\\(.*\\)$/\\1/p\' "${config[@]}"));\r\n        if ((${#hosts[@]} != 0)); then\r\n            COMPREPLY+=($(compgen -P "$prefix"                 -S "$suffix" -W \'${hosts[@]%%[*?%]*}\' -X \'\\!*\' -- "$cur"));\r\n        fi;\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_AVAHI-} ]] &amp;&amp; type avahi-browse &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -P "$prefix" -S "$suffix" -W             "$(avahi-browse -cpr _workstation._tcp 2&gt;/dev/null |\r\n                awk -F\';\' \'/^=/ { print $7 }\' | sort -u)" -- "$cur"));\r\n    fi;\r\n    if type ruptime &amp;&gt; /dev/null; then\r\n        COMPREPLY+=($(compgen -W             "$(ruptime 2&gt;/dev/null | awk \'!/^ruptime:/ { print $1 }\')"             -- "$cur"));\r\n    fi;\r\n    if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then\r\n        COMPREPLY+=($(compgen -A hostname -P "$prefix" -S "$suffix" -- "$cur"));\r\n    fi;\r\n    $reset;\r\n    if [[ -v ipv4 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/*:*$suffix/}");\r\n    fi;\r\n    if [[ -v ipv6 ]]; then\r\n        COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");\r\n    fi;\r\n    if [[ -v ipv4 || -v ipv6 ]]; then\r\n        for i in "${!COMPREPLY[@]}";\r\n        do\r\n            [[ -n ${COMPREPLY[i]} ]] || unset -v "COMPREPLY[i]";\r\n        done;\r\n    fi;\r\n    __ltrim_colon_completions "$prefix$cur"\r\n}\r\n_longopt () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    case "${prev,,}" in \r\n        --help | --usage | --version)\r\n            return\r\n        ;;\r\n        --!(no-*)dir*)\r\n            _filedir -d;\r\n            return\r\n        ;;\r\n        --!(no-*)@(file|path)*)\r\n            _filedir;\r\n            return\r\n        ;;\r\n        --+([-a-z0-9_]))\r\n            local argtype=$(LC_ALL=C $1 --help 2&gt;&amp;1 | command sed -ne                 "s|.*$prev\\[\\{0,1\\}=[&lt;[]\\{0,1\\}\\([-A-Za-z0-9_]\\{1,\\}\\).*|\\1|p");\r\n            case ${argtype,,} in \r\n                *dir*)\r\n                    _filedir -d;\r\n                    return\r\n                ;;\r\n                *file* | *path*)\r\n                    _filedir;\r\n                    return\r\n                ;;\r\n            esac\r\n        ;;\r\n    esac;\r\n    $split &amp;&amp; return;\r\n    if [[ $cur == -* ]]; then\r\n        COMPREPLY=($(compgen -W "$(LC_ALL=C $1 --help 2&gt;&amp;1 |\r\n            while read -r line; do\r\n                [[ $line =~ --[A-Za-z0-9]+([-_][A-Za-z0-9]+)*=? ]] &amp;&amp;\r\n                    printf \'%s\\n\' ${BASH_REMATCH[0]}\r\n            done)" -- "$cur"));\r\n        [[ ${COMPREPLY-} == *= ]] &amp;&amp; compopt -o nospace;\r\n    else\r\n        if [[ $1 == *@(rmdir|chroot) ]]; then\r\n            _filedir -d;\r\n        else\r\n            [[ $1 == *mkdir ]] &amp;&amp; compopt -o nospace;\r\n            _filedir;\r\n        fi;\r\n    fi\r\n}\r\n_mac_addresses () \r\n{ \r\n    local re=\'\\([A-Fa-f0-9]\\{2\\}:\\)\\{5\\}[A-Fa-f0-9]\\{2\\}\';\r\n    local PATH="$PATH:/sbin:/usr/sbin";\r\n    COMPREPLY+=($(\r\n        {\r\n            LC_ALL=C ifconfig -a || ip link show\r\n        } 2&gt;/dev/null | command sed -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*/\\1/p" -ne             "s/.*[[:space:]]HWaddr[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$/\\1/p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]].*|\\2|p" -ne             "s|.*[[:space:]]\\(link/\\)\\{0,1\\}ether[[:space:]]\\{1,\\}\\($re\\)[[:space:]]*$|\\2|p"\r\n    ));\r\n    COMPREPLY+=($({\r\n        arp -an || ip neigh show\r\n    } 2&gt;/dev/null | command sed -ne         "s/.*[[:space:]]\\($re\\)[[:space:]].*/\\1/p" -ne         "s/.*[[:space:]]\\($re\\)[[:space:]]*$/\\1/p"));\r\n    COMPREPLY+=($(command sed -ne         "s/^[[:space:]]*\\($re\\)[[:space:]].*/\\1/p" /etc/ethers 2&gt;/dev/null));\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]}\' -- "$cur"));\r\n    __ltrim_colon_completions "$cur"\r\n}\r\n_minimal () \r\n{ \r\n    local cur prev words cword split;\r\n    _init_completion -s || return;\r\n    $split &amp;&amp; return;\r\n    _filedir\r\n}\r\n_modules () \r\n{ \r\n    local modpath;\r\n    modpath=/lib/modules/$1;\r\n    COMPREPLY=($(compgen -W "$(command ls -RL $modpath 2&gt;/dev/null |\r\n        command sed -ne \'s/^\\(.*\\)\\.k\\{0,1\\}o\\(\\.[gx]z\\)\\{0,1\\}$/\\1/p\')" -- "$cur"))\r\n}\r\n_ncpus () \r\n{ \r\n    local var=NPROCESSORS_ONLN;\r\n    [[ $OSTYPE == *linux* ]] &amp;&amp; var=_$var;\r\n    local n=$(getconf $var 2&gt;/dev/null);\r\n    printf %s ${n:-1}\r\n}\r\n_parse_help () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---help} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        [[ $line == *([[:blank:]])-* ]] || continue;\r\n        while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)\\[?[A-Z0-9]+([,_-]+[A-Z0-9]+)?(\\.\\.+)?\\]? ]]; do\r\n            line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"};\r\n        done;\r\n        __parse_options "${line// or /, }";\r\n    done\r\n}\r\n_parse_usage () \r\n{ \r\n    eval local cmd="$(quote "$1")";\r\n    local line match option i char;\r\n    { \r\n        case $cmd in \r\n            -)\r\n                cat\r\n            ;;\r\n            *)\r\n                LC_ALL=C "$(dequote "$cmd")" ${2:---usage} 2&gt;&amp;1\r\n            ;;\r\n        esac\r\n    } | while read -r line; do\r\n        while [[ $line =~ \\[[[:space:]]*(-[^]]+)[[:space:]]*\\] ]]; do\r\n            match=${BASH_REMATCH[0]};\r\n            option=${BASH_REMATCH[1]};\r\n            case $option in \r\n                -?(\\[)+([a-zA-Z0-9?]))\r\n                    for ((i = 1; i &lt; ${#option}; i++))\r\n                    do\r\n                        char=${option:i:1};\r\n                        [[ $char != \'[\' ]] &amp;&amp; printf \'%s\\n\' -$char;\r\n                    done\r\n                ;;\r\n                *)\r\n                    __parse_options "$option"\r\n                ;;\r\n            esac;\r\n            line=${line#*"$match"};\r\n        done;\r\n    done\r\n}\r\n_pci_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lspci -n | awk \'{print $3}\')" -- "$cur"))\r\n}\r\n_pgids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pgid=)\' -- "$cur"))\r\n}\r\n_pids () \r\n{ \r\n    COMPREPLY=($(compgen -W \'$(command ps axo pid=)\' -- "$cur"))\r\n}\r\n_pnames () \r\n{ \r\n    local -a procs;\r\n    if [[ ${1-} == -s ]]; then\r\n        procs=($(command ps axo comm | command sed -e 1d));\r\n    else\r\n        local line i=-1 ifs=$IFS;\r\n        IFS=\'\r\n\';\r\n        local -a psout=($(command ps axo command=));\r\n        IFS=$ifs;\r\n        for line in "${psout[@]}";\r\n        do\r\n            if ((i == -1)); then\r\n                if [[ $line =~ ^(.*[[:space:]])COMMAND([[:space:]]|$) ]]; then\r\n                    i=${#BASH_REMATCH[1]};\r\n                else\r\n                    break;\r\n                fi;\r\n            else\r\n                line=${line:i};\r\n                line=${line%% *};\r\n                procs+=($line);\r\n            fi;\r\n        done;\r\n        if ((i == -1)); then\r\n            for line in "${psout[@]}";\r\n            do\r\n                if [[ $line =~ ^[[(](.+)[])]$ ]]; then\r\n                    procs+=(${BASH_REMATCH[1]});\r\n                else\r\n                    line=${line%% *};\r\n                    line=${line##@(*/|-)};\r\n                    procs+=($line);\r\n                fi;\r\n            done;\r\n        fi;\r\n    fi;\r\n    COMPREPLY=($(compgen -X "&lt;defunct&gt;" -W \'${procs[@]}\' -- "$cur"))\r\n}\r\n_quote_readline_by_ref () \r\n{ \r\n    if [ -z "$1" ]; then\r\n        printf -v $2 %s "$1";\r\n    else\r\n        if [[ $1 == \\\'* ]]; then\r\n            printf -v $2 %s "${1:1}";\r\n        else\r\n            if [[ $1 == \\~* ]]; then\r\n                printf -v $2 \\~%q "${1:1}";\r\n            else\r\n                printf -v $2 %q "$1";\r\n            fi;\r\n        fi;\r\n    fi;\r\n    [[ ${!2} == \\$* ]] &amp;&amp; eval $2=${!2}\r\n}\r\n_realcommand () \r\n{ \r\n    type -P "$1" &gt; /dev/null &amp;&amp; { \r\n        if type -p realpath &gt; /dev/null; then\r\n            realpath "$(type -P "$1")";\r\n        else\r\n            if type -p greadlink &gt; /dev/null; then\r\n                greadlink -f "$(type -P "$1")";\r\n            else\r\n                if type -p readlink &gt; /dev/null; then\r\n                    readlink -f "$(type -P "$1")";\r\n                else\r\n                    type -P "$1";\r\n                fi;\r\n            fi;\r\n        fi\r\n    }\r\n}\r\n_rl_enabled () \r\n{ \r\n    [[ "$(bind -v)" == *$1+([[:space:]])on* ]]\r\n}\r\n_root_command () \r\n{ \r\n    local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin;\r\n    local root_command=$1;\r\n    _command\r\n}\r\n_service () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion || return;\r\n    ((cword &gt; 2)) &amp;&amp; return;\r\n    if [[ $cword -eq 1 &amp;&amp; $prev == ?(*/)service ]]; then\r\n        _services;\r\n        [[ -e /etc/mandrake-release ]] &amp;&amp; _xinetd_services;\r\n    else\r\n        local sysvdirs;\r\n        _sysvdirs;\r\n        COMPREPLY=($(compgen -W \'`command sed -e "y/|/ /" \\\r\n            -ne "s/^.*\\(U\\|msg_u\\)sage.*{\\(.*\\)}.*$/\\2/p" \\\r\n            ${sysvdirs[0]}/${prev##*/} 2&gt;/dev/null` start stop\' -- "$cur"));\r\n    fi\r\n}\r\n_services () \r\n{ \r\n    local sysvdirs;\r\n    _sysvdirs;\r\n    local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n    shopt -s nullglob;\r\n    COMPREPLY=($(printf \'%s\\n\' ${sysvdirs[0]}/!($_backup_glob|functions|README)));\r\n    $reset;\r\n    COMPREPLY+=($({\r\n        systemctl list-units --full --all ||\r\n            systemctl list-unit-files\r\n    } 2&gt;/dev/null |\r\n        awk \'$1 ~ /\\.service$/ { sub("\\\\.service$", "", $1); print $1 }\'));\r\n    if [[ -x /sbin/upstart-udev-bridge ]]; then\r\n        COMPREPLY+=($(initctl list 2&gt;/dev/null | cut -d\' \' -f1));\r\n    fi;\r\n    COMPREPLY=($(compgen -W \'${COMPREPLY[@]#${sysvdirs[0]}/}\' -- "$cur"))\r\n}\r\n_shells () \r\n{ \r\n    local shell rest;\r\n    while read -r shell rest; do\r\n        [[ $shell == /* &amp;&amp; $shell == "$cur"* ]] &amp;&amp; COMPREPLY+=($shell);\r\n    done 2&gt; /dev/null &lt; /etc/shells\r\n}\r\n_signals () \r\n{ \r\n    local -a sigs=($(compgen -P "${1-}" -A signal "SIG${cur#${1-}}"));\r\n    COMPREPLY+=("${sigs[@]/#${1-}SIG/${1-}}")\r\n}\r\n_split_longopt () \r\n{ \r\n    if [[ $cur == --?*=* ]]; then\r\n        prev="${cur%%?(\\\\)=*}";\r\n        cur="${cur#*=}";\r\n        return 0;\r\n    fi;\r\n    return 1\r\n}\r\n_sysvdirs () \r\n{ \r\n    sysvdirs=();\r\n    [[ -d /etc/rc.d/init.d ]] &amp;&amp; sysvdirs+=(/etc/rc.d/init.d);\r\n    [[ -d /etc/init.d ]] &amp;&amp; sysvdirs+=(/etc/init.d);\r\n    [[ -f /etc/slackware-version ]] &amp;&amp; sysvdirs=(/etc/rc.d);\r\n    return 0\r\n}\r\n_terms () \r\n{ \r\n    COMPREPLY+=($(compgen -W "$({\r\n        command sed -ne \'s/^\\([^[:space:]#|]\\{2,\\}\\)|.*/\\1/p\' /etc/termcap\r\n        {\r\n            toe -a || toe\r\n        } | awk \'{ print $1 }\'\r\n        find /{etc,lib,usr/lib,usr/share}/terminfo/? -type f -maxdepth 1 |\r\n            awk -F/ \'{ print $NF }\'\r\n    } 2&gt;/dev/null)" -- "$cur"))\r\n}\r\n_tilde () \r\n{ \r\n    local result=0;\r\n    if [[ ${1-} == \\~* &amp;&amp; $1 != */* ]]; then\r\n        COMPREPLY=($(compgen -P \'~\' -u -- "${1#\\~}"));\r\n        result=${#COMPREPLY[@]};\r\n        ((result &gt; 0)) &amp;&amp; compopt -o filenames 2&gt; /dev/null;\r\n    fi;\r\n    return $result\r\n}\r\n_uids () \r\n{ \r\n    if type getent &amp;&gt; /dev/null; then\r\n        COMPREPLY=($(compgen -W \'$(getent passwd | cut -d: -f3)\' -- "$cur"));\r\n    else\r\n        if type perl &amp;&gt; /dev/null; then\r\n            COMPREPLY=($(compgen -W \'$(perl -e \'"\'"\'while (($uid) = (getpwent)[2]) { print $uid . "\\n" }\'"\'"\')\' -- "$cur"));\r\n        else\r\n            COMPREPLY=($(compgen -W \'$(cut -d: -f3 /etc/passwd)\' -- "$cur"));\r\n        fi;\r\n    fi\r\n}\r\n_upvar () \r\n{ \r\n    echo "bash_completion: $FUNCNAME: deprecated function," "use _upvars instead" 1&gt;&amp;2;\r\n    if unset -v "$1"; then\r\n        if (($# == 2)); then\r\n            eval $1=\\"\\$2\\";\r\n        else\r\n            eval $1=\\(\\"\\$"{@:2}"\\"\\);\r\n        fi;\r\n    fi\r\n}\r\n_upvars () \r\n{ \r\n    if ! (($#)); then\r\n        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1&gt;&amp;2;\r\n        return 2;\r\n    fi;\r\n    while (($#)); do\r\n        case $1 in \r\n            -a*)\r\n                [[ -n ${1#-a} ]] || { \r\n                    echo "bash_completion: $FUNCNAME:" "\\`$1\': missing number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                printf %d "${1#-a}" &amp;&gt; /dev/null || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1\': invalid number specifier" 1&gt;&amp;2;\r\n                    return 1\r\n                };\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\(\\"\\$"{@:3:${1#-a}}"\\"\\) &amp;&amp; shift $((${1#-a} + 2)) || { \r\n                    echo bash_completion: "$FUNCNAME: \\`$1${2+ }$2\': missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            -v)\r\n                [[ -n "$2" ]] &amp;&amp; unset -v "$2" &amp;&amp; eval $2=\\"\\$3\\" &amp;&amp; shift 3 || { \r\n                    echo "bash_completion: $FUNCNAME: $1:" "missing argument(s)" 1&gt;&amp;2;\r\n                    return 1\r\n                }\r\n            ;;\r\n            *)\r\n                echo "bash_completion: $FUNCNAME: $1: invalid option" 1&gt;&amp;2;\r\n                return 1\r\n            ;;\r\n        esac;\r\n    done\r\n}\r\n_usb_ids () \r\n{ \r\n    COMPREPLY+=($(compgen -W         "$(PATH="$PATH:/sbin" lsusb | awk \'{print $6}\')" -- "$cur"))\r\n}\r\n_user_at_host () \r\n{ \r\n    local cur prev words cword;\r\n    _init_completion -n : || return;\r\n    if [[ $cur == *@* ]]; then\r\n        _known_hosts_real "$cur";\r\n    else\r\n        COMPREPLY=($(compgen -u -S @ -- "$cur"));\r\n        compopt -o nospace;\r\n    fi\r\n}\r\n_usergroup () \r\n{ \r\n    if [[ $cur == *\\\\\\\\* || $cur == *:*:* ]]; then\r\n        return;\r\n    else\r\n        if [[ $cur == *\\\\:* ]]; then\r\n            local prefix;\r\n            prefix=${cur%%*([^:])};\r\n            prefix=${prefix//\\\\/};\r\n            local mycur="${cur#*[:]}";\r\n            if [[ ${1-} == -u ]]; then\r\n                _allowed_groups "$mycur";\r\n            else\r\n                local IFS=\'\r\n\';\r\n                COMPREPLY=($(compgen -g -- "$mycur"));\r\n            fi;\r\n            COMPREPLY=($(compgen -P "$prefix" -W "${COMPREPLY[@]}"));\r\n        else\r\n            if [[ $cur == *:* ]]; then\r\n                local mycur="${cur#*:}";\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_groups "$mycur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -g -- "$mycur"));\r\n                fi;\r\n            else\r\n                if [[ ${1-} == -u ]]; then\r\n                    _allowed_users "$cur";\r\n                else\r\n                    local IFS=\'\r\n\';\r\n                    COMPREPLY=($(compgen -u -- "$cur"));\r\n                fi;\r\n            fi;\r\n        fi;\r\n    fi\r\n}\r\n_userland () \r\n{ \r\n    local userland=$(uname -s);\r\n    [[ $userland == @(Linux|GNU/*) ]] &amp;&amp; userland=GNU;\r\n    [[ $userland == "$1" ]]\r\n}\r\n_variable_assignments () \r\n{ \r\n    local cur=${1-};\r\n    if [[ $cur =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then\r\n        prev=${BASH_REMATCH[1]};\r\n        cur=${BASH_REMATCH[2]};\r\n    else\r\n        return 1;\r\n    fi;\r\n    case $prev in \r\n        TZ)\r\n            cur=/usr/share/zoneinfo/$cur;\r\n            _filedir;\r\n            for i in "${!COMPREPLY[@]}";\r\n            do\r\n                if [[ ${COMPREPLY[i]} == *.tab ]]; then\r\n                    unset \'COMPREPLY[i]\';\r\n                    continue;\r\n                else\r\n                    if [[ -d ${COMPREPLY[i]} ]]; then\r\n                        COMPREPLY[i]+=/;\r\n                        compopt -o nospace;\r\n                    fi;\r\n                fi;\r\n                COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/};\r\n            done\r\n        ;;\r\n        TERM)\r\n            _terms\r\n        ;;\r\n        LANG | LC_*)\r\n            COMPREPLY=($(compgen -W \'$(locale -a 2&gt;/dev/null)\'                 -- "$cur"))\r\n        ;;\r\n        *)\r\n            _variables &amp;&amp; return 0;\r\n            _filedir\r\n        ;;\r\n    esac;\r\n    return 0\r\n}\r\n_variables () \r\n{ \r\n    if [[ $cur =~ ^(\\$(\\{[!#]?)?)([A-Za-z0-9_]*)$ ]]; then\r\n        if [[ $cur == \'${\'* ]]; then\r\n            local arrs vars;\r\n            vars=($(compgen -A variable -P ${BASH_REMATCH[1]} -S \'}\' -- ${BASH_REMATCH[3]}));\r\n            arrs=($(compgen -A arrayvar -P ${BASH_REMATCH[1]} -S \'[\' -- ${BASH_REMATCH[3]}));\r\n            if ((${#vars[@]} == 1 &amp;&amp; ${#arrs[@]} != 0)); then\r\n                compopt -o nospace;\r\n                COMPREPLY+=(${arrs[*]});\r\n            else\r\n                COMPREPLY+=(${vars[*]});\r\n            fi;\r\n        else\r\n            COMPREPLY+=($(compgen -A variable -P \'$\' -- "${BASH_REMATCH[3]}"));\r\n        fi;\r\n        return 0;\r\n    else\r\n        if [[ $cur =~ ^(\\$\\{[#!]?)([A-Za-z0-9_]*)\\[([^]]*)$ ]]; then\r\n            local IFS=\'\r\n\';\r\n            COMPREPLY+=($(compgen -W \'$(printf %s\\\\n "${!\'${BASH_REMATCH[2]}\'[@]}")\'             -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S \']}\' -- "${BASH_REMATCH[3]}"));\r\n            if [[ ${BASH_REMATCH[3]} == [@*] ]]; then\r\n                COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}");\r\n            fi;\r\n            __ltrim_colon_completions "$cur";\r\n            return 0;\r\n        else\r\n            if [[ $cur =~ ^\\$\\{[#!]?[A-Za-z0-9_]*\\[.*\\]$ ]]; then\r\n                COMPREPLY+=("$cur}");\r\n                __ltrim_colon_completions "$cur";\r\n                return 0;\r\n            fi;\r\n        fi;\r\n    fi;\r\n    return 1\r\n}\r\n_xfunc () \r\n{ \r\n    set -- "$@";\r\n    local srcfile=$1;\r\n    shift;\r\n    declare -F $1 &amp;&gt; /dev/null || __load_completion "$srcfile";\r\n    "$@"\r\n}\r\n_xinetd_services () \r\n{ \r\n    local xinetddir=${BASHCOMP_XINETDDIR:-/etc/xinetd.d};\r\n    if [[ -d $xinetddir ]]; then\r\n        local IFS=\' \t\r\n\' reset=$(shopt -p nullglob);\r\n        shopt -s nullglob;\r\n        local -a svcs=($(printf \'%s\\n\' $xinetddir/!($_backup_glob)));\r\n        $reset;\r\n        ((!${#svcs[@]})) || COMPREPLY+=($(compgen -W \'${svcs[@]#$xinetddir/}\' -- "${cur-}"));\r\n    fi\r\n}\r\ncommand_not_found_handle () \r\n{ \r\n    if [ -x /usr/lib/command-not-found ]; then\r\n        /usr/lib/command-not-found -- "$1";\r\n        return $?;\r\n    else\r\n        if [ -x /usr/share/command-not-found/command-not-found ]; then\r\n            /usr/share/command-not-found/command-not-found -- "$1";\r\n            return $?;\r\n        else\r\n            printf "%s: command not found\\n" "$1" 1&gt;&amp;2;\r\n            return 127;\r\n        fi;\r\n    fi\r\n}\r\ndequote () \r\n{ \r\n    eval printf %s "$1" 2&gt; /dev/null\r\n}\r\ngawklibpath_append () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$AWKLIBPATH:$*"\r\n}\r\ngawklibpath_default () \r\n{ \r\n    unset AWKLIBPATH;\r\n    export AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`\r\n}\r\ngawklibpath_prepend () \r\n{ \r\n    [ -z "$AWKLIBPATH" ] &amp;&amp; AWKLIBPATH=`gawk \'BEGIN {print ENVIRON["AWKLIBPATH"]}\'`;\r\n    export AWKLIBPATH="$*:$AWKLIBPATH"\r\n}\r\ngawkpath_append () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$AWKPATH:$*"\r\n}\r\ngawkpath_default () \r\n{ \r\n    unset AWKPATH;\r\n    export AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`\r\n}\r\ngawkpath_prepend () \r\n{ \r\n    [ -z "$AWKPATH" ] &amp;&amp; AWKPATH=`gawk \'BEGIN {print ENVIRON["AWKPATH"]}\'`;\r\n    export AWKPATH="$*:$AWKPATH"\r\n}\r\nquote () \r\n{ \r\n    local quoted=${1//\\\'/\\\'\\\\\\\'\\\'};\r\n    printf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.479238" elapsed="0.003248">OSError: [Errno 36] File name too long: 'local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"\r\n}\r\n__git_eread () \r\n{ \r\n    test -r "$1" &amp;&amp; IFS=\'\r\r\n\' read "$2" &lt; "$1"\r\n}\r\n__git_ps1 () \r\n{ \r\n    local exit=$?;\r\n    local pcmode=no;\r\n    local detached=no;\r\n    local ps1pc_start=\'\\u@\\h:\\w \';\r\n    local ps1pc_end=\'\\$ \';\r\n    local printf_format=\' (%s)\';\r\n    case "$#" in \r\n        2 | 3)\r\n            pcmode=yes;\r\n            ps1pc_start="$1";\r\n            ps1pc_end="$2";\r\n            printf_format="${3:-$printf_format}";\r\n            PS1="$ps1pc_start$ps1pc_end"\r\n        ;;\r\n        0 | 1)\r\n            printf_format="${1:-$printf_format}"\r\n        ;;\r\n        *)\r\n            return $exit\r\n        ;;\r\n    esac;\r\n    local ps1_expanded=yes;\r\n    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;\r\n    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;\r\n    local repo_info rev_parse_exit_code;\r\n    repo_info="$(git rev-parse --git-dir --is-inside-git-dir \t\t--is-bare-repository --is-inside-work-tree \t\t--short HEAD 2&gt;/dev/null)";\r\n    rev_parse_exit_code="$?";\r\n    if [ -z "$repo_info" ]; then\r\n        return $exit;\r\n    fi;\r\n    local short_sha="";\r\n    if [ "$rev_parse_exit_code" = "0" ]; then\r\n        short_sha="${repo_info##*\r\n}";\r\n        repo_info="${repo_info%\r\n*}";\r\n    fi;\r\n    local inside_worktree="${repo_info##*\r\n}";\r\n    rep...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.482579" elapsed="0.000017"/>
</return>
<arg>remove-not-existing</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:50:05.617411" elapsed="1.865319">OSError: [Errno 36] File name too long: 'local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"\r\n}\r\n__git_eread () \r\n{ \r\n    test -r "$1" &amp;&amp; IFS=\'\r\r\n\' read "$2" &lt; "$1"\r\n}\r\n__git_ps1 () \r\n{ \r\n    local exit=$?;\r\n    local pcmode=no;\r\n    local detached=no;\r\n    local ps1pc_start=\'\\u@\\h:\\w \';\r\n    local ps1pc_end=\'\\$ \';\r\n    local printf_format=\' (%s)\';\r\n    case "$#" in \r\n        2 | 3)\r\n            pcmode=yes;\r\n            ps1pc_start="$1";\r\n            ps1pc_end="$2";\r\n            printf_format="${3:-$printf_format}";\r\n            PS1="$ps1pc_start$ps1pc_end"\r\n        ;;\r\n        0 | 1)\r\n            printf_format="${1:-$printf_format}"\r\n        ;;\r\n        *)\r\n            return $exit\r\n        ;;\r\n    esac;\r\n    local ps1_expanded=yes;\r\n    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;\r\n    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;\r\n    local repo_info rev_parse_exit_code;\r\n    repo_info="$(git rev-parse --git-dir --is-inside-git-dir \t\t--is-bare-repository --is-inside-work-tree \t\t--short HEAD 2&gt;/dev/null)";\r\n    rev_parse_exit_code="$?";\r\n    if [ -z "$repo_info" ]; then\r\n        return $exit;\r\n    fi;\r\n    local short_sha="";\r\n    if [ "$rev_parse_exit_code" = "0" ]; then\r\n        short_sha="${repo_info##*\r\n}";\r\n        repo_info="${repo_info%\r\n*}";\r\n    fi;\r\n    local inside_worktree="${repo_info##*\r\n}";\r\n    rep...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:50:07.484072" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:50:07.483681" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.483645" elapsed="0.000512"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:50:07.484327" elapsed="0.000380"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.489575" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:50:07.488966" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:50:07.489836" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.489692" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.489672" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.490323" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:50:07.490029" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:50:07.490779" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Remove_Not_Existing_Module</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.490492" elapsed="0.000313"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:50:07.491122" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:50:07.490950" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.491627" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:50:07.491286" elapsed="0.000381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.492121" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:50:07.491809" elapsed="0.000339"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.492756" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"\r\n}\r\n__git_eread () \r\n{ \r\n    test -r "$1" &amp;&amp; IFS=\'\r\r\n\' read "$2" &lt; "$1"\r\n}\r\n__git_ps1 () \r\n{ \r\n    local exit=$?;\r\n    local pcmode=no;\r\n    local detached=no;\r\n    local ps1pc_start=\'\\u@\\h:\\w \';\r\n    local ps1pc_end=\'\\$ \';\r\n    local printf_format=\' (%s)\';\r\n    case "$#" in \r\n        2 | 3)\r\n            pcmode=yes;\r\n            ps1pc_start="$1";\r\n            ps1pc_end="$2";\r\n            printf_format="${3:-$printf_format}";\r\n            PS1="$ps1pc_start$ps1pc_end"\r\n        ;;\r\n        0 | 1)\r\n            printf_format="${1:-$printf_format}"\r\n        ;;\r\n        *)\r\n            return $exit\r\n        ;;\r\n    esac;\r\n    local ps1_expanded=yes;\r\n    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;\r\n    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;\r\n    local repo_info rev_parse_exit_code;\r\n    repo_info="$(git rev-parse --git-dir --is-inside-git-dir \t\t--is-bare-repository --is-inside-work-tree \t\t--short HEAD 2&gt;/dev/null)";\r\n    rev_parse_exit_code="$?";\r\n    if [ -z "$repo_info" ]; then\r\n        return $exit;\r\n    fi;\r\n    local short_sha="";\r\n    if [ "$rev_parse_exit_code" = "0" ]; then\r\n        short_sha="${repo_info##*\r\n}";\r\n        repo_info="${repo_info%\r\n*}";\r\n    fi;\r\n    local inside_worktree="${repo_info##*\r\n}";\r\n    rep...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:50:07.492302" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.493271" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:07.492976" elapsed="0.000342"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:50:07.488673" elapsed="0.004698"/>
</kw>
<status status="PASS" start="2026-04-25T23:50:07.483447" elapsed="0.010005"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:50:07.483075" elapsed="0.010419"/>
</kw>
<doc>Attempt to remove the "module" element again and check that the operation is "silently ignored".</doc>
<status status="FAIL" start="2026-04-25T23:50:05.556499" elapsed="1.937036">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"

OSError: [Errno 36] File name too long: 'local "$2" "$3" "$4" &amp;&amp; _upvars -a${#words[@]} $2 ${words+"${words[@]}"} -v $3 "$cword" -v $4 "${cur:0:index}"\r\n}\r\n__git_eread () \r\n{ \r\n    test -r "$1" &amp;&amp; IFS=\'\r\r\n\' read "$2" &lt; "$1"\r\n}\r\n__git_ps1 () \r\n{ \r\n    local exit=$?;\r\n    local pcmode=no;\r\n    local detached=no;\r\n    local ps1pc_start=\'\\u@\\h:\\w \';\r\n    local ps1pc_end=\'\\$ \';\r\n    local printf_format=\' (%s)\';\r\n    case "$#" in \r\n        2 | 3)\r\n            pcmode=yes;\r\n            ps1pc_start="$1";\r\n            ps1pc_end="$2";\r\n            printf_format="${3:-$printf_format}";\r\n            PS1="$ps1pc_start$ps1pc_end"\r\n        ;;\r\n        0 | 1)\r\n            printf_format="${1:-$printf_format}"\r\n        ;;\r\n        *)\r\n            return $exit\r\n        ;;\r\n    esac;\r\n    local ps1_expanded=yes;\r\n    [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no;\r\n    [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no;\r\n    local repo_info rev_parse_exit_code;\r\n    repo_info="$(git rev-parse --git-dir --is-inside-git-dir \t\t--is-bare-repository --is-inside-work-tree \t\t--short HEAD 2&gt;/dev/null)";\r\n    rev_parse_exit_code="$?";\r\n    if [ -z "$repo_info" ]; then\r\n        return $exit;\r\n    fi;\r\n    local short_sha="";\r\n    if [ "$rev_parse_exit_code" = "0" ]; then\r\n        short_sha="${repo_info##*\r\n}";\r\n        repo_info="${repo_info%\r\n*}";\r\n    fi;\r\n    local inside_worktree="${repo_info##*\r\n}";\r\n    rep...
    [ Message content over the limit has been removed. ]
...ntf "\'%s\'" "$quoted"\r\n}\r\nquote_readline () \r\n{ \r\n    local ret;\r\n    _quote_readline_by_ref "$1" ret;\r\n    printf %s "$ret"\r\n}\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/test-option&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;default-operation&gt;none&lt;/default-operation&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;config xmlns:a="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car" a:operation="remove"&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;       &lt;/cars&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;/config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/edit-config&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;\r\n\x1b[?2004l\r-bash: syntax error near unexpected token `newline\'\r\n\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; \r\n\x1b[?2004l\r\x1b[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;'</status>
</test>
<test id="s1-s3-s1-t48" name="Commit_Remove_Not_Existing_Module" line="316">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:50:07.497051" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:50:07.496798" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.498280" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.498170" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.498152" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.503182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.503074" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.503056" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.504234" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:50:07.503846" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.504733" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:50:07.504421" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:50:07.504803" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:50:07.504959" 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-04-25T23:50:07.503464" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.510051" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.509935" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.509916" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.511319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.511214" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.511197" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:50:07.511929" 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-04-25T23:50:07.511550" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.512370" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:07.512103" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.513216" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.512938" elapsed="0.001228">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:50:07.514352" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:50:07.514399" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.512544" elapsed="0.001879"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.515264" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.514984" elapsed="0.001376">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:50:07.516541" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:50:07.516587" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.514579" elapsed="0.002032"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.517686" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.516912" elapsed="0.000856">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:50:07.516704" elapsed="0.001162">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:50:07.516684" elapsed="0.001217">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.518051" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.518265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:50:07.518137" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:50:07.518120" elapsed="0.000240"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.518393" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:07.521402" elapsed="0.000154"/>
</kw>
<msg time="2026-04-25T23:50:07.521627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:50:07.520634" elapsed="0.001107"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.522670" elapsed="0.000042"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.523514" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:50:07.519235" elapsed="0.004394"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:50:07.518643" elapsed="0.005211"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.510916" elapsed="0.013025">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</status>
</kw>
<msg time="2026-04-25T23:50:07.524046" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:50:07.524090" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Commit_Remove_Not_Existing_Module"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.510257" elapsed="0.013857"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.524309" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.524191" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.524171" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.525164" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:50:07.525060" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.525043" elapsed="0.000219"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.525527" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:50:07.525630" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:50:07.525404" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.526074" level="INFO">{1: 87}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:07.525814" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:50:07.526500" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:50:07.526259" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.527056" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:50:07.527478" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:50:07.527524" level="INFO">${old_connection_index} = 87</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.526711" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:07.528458" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.530437" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.530017" elapsed="0.000970">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.528867" elapsed="0.002196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:50:07.532541" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.531292" elapsed="0.001686"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:50:07.527949" elapsed="0.005131"/>
</kw>
<status status="PASS" start="2026-04-25T23:50:07.527623" elapsed="0.005508"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.527605" elapsed="0.005551"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:50:07.534081" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.533675" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:50:07.534156" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:50:07.534307" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:50:07.533348" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.534473" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.535332" level="INFO">index=88
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:50:07.535060" elapsed="0.000404"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:50:07.535602" elapsed="0.002041"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.538101" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:50:07.539253" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.537809" elapsed="0.001815">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:50:07.549017" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:50:07.549400" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:50:07.547726" elapsed="0.001882"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.549950" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.550233" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:50:07.540509" elapsed="0.009870"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:50:07.540006" elapsed="0.010421"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.524772" elapsed="0.025736">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.550846" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:50:07.550925" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.509586" elapsed="0.041442">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:50:07.551134" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:50:07.551177" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.505348" elapsed="0.045852"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:50:07.551515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:50:07.551277" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-25T23:50:07.551258" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:50:07.505218" elapsed="0.046396"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:50:07.505041" elapsed="0.046604"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:50:07.502708" elapsed="0.049211"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:50:07.497884" elapsed="0.054092"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:50:07.497450" elapsed="0.054571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:50:07.494515" elapsed="0.057560"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:50:07.553359" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/remove-not-existing-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:50:07.553497" level="INFO">${data} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="88"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:50:07.553143" elapsed="0.000381"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:50:07.553570" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:50:07.553733" level="INFO">${request} = &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="88"&gt;
&lt;commit/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:50:07.552839" elapsed="0.000921"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:50:07.554490" elapsed="0.000319"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.555591" level="INFO">[?2004l-bash: syntax error near unexpected token `]]'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:50:07.554951" elapsed="0.000689"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:50:07.561315" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="88"&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;commit/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:50:07.555992" elapsed="0.005392"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:50:07.554194" elapsed="0.007251"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.562218" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.561585" elapsed="60.001339">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.563155" elapsed="0.000040"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.553901" elapsed="60.009432">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.563399" elapsed="0.000016"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.552533" elapsed="60.010966">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.563770" elapsed="0.000028"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.563986" elapsed="0.000022"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.564150" elapsed="0.000021"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.564312" elapsed="0.001814"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.566182" elapsed="0.000017"/>
</return>
<arg>remove-not-existing-commit</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:50:07.552242" elapsed="60.014047">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.567670" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:51:07.567153" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:51:07.567932" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.567782" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.567761" elapsed="0.000235"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:51:07.568167" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.569283" level="FAIL">'4455' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.568924" elapsed="0.000420">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-25T23:51:07.569439" level="INFO">${match} = False</msg>
<var>${match}</var>
<arg>Should Contain</arg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:51:07.568558" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.569974" level="INFO">${bug_url} = https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${bug_url}</var>
<arg>${match}</arg>
<arg>https://jira.opendaylight.org/browse/${number}</arg>
<arg>https://bugs.opendaylight.org/show_bug.cgi?id=${number}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:51:07.569621" elapsed="0.000380"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.570442" level="INFO">${msg} = This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<var>${msg}</var>
<arg>This test fails due to ${bug_url}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:51:07.570151" elapsed="0.000318"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.570928" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:51:07.570618" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.571472" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:51:07.571097" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.571922" level="INFO">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455</msg>
<arg>${msg}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:51:07.571679" 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-04-25T23:51:07.572610" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4455'.</msg>
<arg>${bug_url}</arg>
<doc>Adds given ``tags`` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-04-25T23:51:07.572256" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-04-25T23:51:07.572033" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.572015" elapsed="0.000717"/>
</if>
<arg>4455</arg>
<doc>Report that a test failed due to a known Bugzilla bug whose
number is provided as an argument.
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:51:07.566762" elapsed="0.006017"/>
</kw>
<doc>Attempt to commit and check the reply.</doc>
<tag>https://bugs.opendaylight.org/show_bug.cgi?id=4455</tag>
<status status="FAIL" start="2026-04-25T23:50:07.494038" elapsed="60.078788">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<test id="s1-s3-s1-t49" name="Close_Session" line="321">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:51:07.577090" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:51:07.576788" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.578329" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.578217" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.578198" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.583033" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.582926" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.582908" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.584080" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:51:07.583700" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.584579" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:51:07.584257" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:51:07.584665" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:51:07.584827" 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-04-25T23:51:07.583314" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.589907" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.589801" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.589782" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.591186" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.591080" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.591062" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:51:07.591770" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:51:07.591387" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.592195" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:51:07.591945" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.593071" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.592797" elapsed="0.001188">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:51:07.594165" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:51:07.594210" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.592370" elapsed="0.001863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.595052" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.594779" elapsed="0.001305">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:51:07.596262" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:51:07.596307" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.594389" elapsed="0.001940"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.597243" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.596624" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:51:07.596405" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:51:07.596386" elapsed="0.001206">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.597759" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.597977" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:51:07.597847" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:51:07.597830" elapsed="0.000275"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.598143" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:51:07.601051" elapsed="0.000154"/>
</kw>
<msg time="2026-04-25T23:51:07.601277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:51:07.600316" elapsed="0.001057"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.602289" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.603131" 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-04-25T23:51:07.598981" elapsed="0.004266"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:51:07.598391" elapsed="0.004973"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.590778" elapsed="0.012672">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</status>
</kw>
<msg time="2026-04-25T23:51:07.603553" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:51:07.603598" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.MDSAL.Northbound.Close_Session"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.590111" elapsed="0.013510"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.603853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.603743" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.603723" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.604751" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:51:07.604601" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.604583" elapsed="0.000236"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.605080" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:51:07.605183" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:51:07.604959" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.605612" level="INFO">{1: 88}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:51:07.605350" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:51:07.606104" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:51:07.605860" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:51:07.606637" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:51:07.607070" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:51:07.607117" level="INFO">${old_connection_index} = 88</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.606294" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:51:07.608037" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.610022" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.609588" elapsed="0.000966">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.608422" elapsed="0.002208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:51:07.612102" elapsed="0.000373"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.610873" elapsed="0.001667"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:51:07.607423" elapsed="0.005221"/>
</kw>
<status status="PASS" start="2026-04-25T23:51:07.607216" elapsed="0.005494"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.607198" elapsed="0.005538"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:51:07.613661" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:51:07.613240" elapsed="0.000450"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:51:07.613780" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:51:07.613936" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:51:07.612929" elapsed="0.001032"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:51:07.614107" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.614815" level="INFO">index=89
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:51:07.614702" 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-04-25T23:51:07.615080" elapsed="0.002227"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.617744" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:51:07.619798" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.617461" elapsed="0.002719">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:51:07.631935" elapsed="0.000468"/>
</kw>
<msg time="2026-04-25T23:51:07.632529" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:51:07.629541" elapsed="0.003136"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.633322" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.633627" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:51:07.620972" elapsed="0.012811"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:51:07.620455" elapsed="0.013376"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.604298" elapsed="0.029615">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.634231" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:51:07.634303" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.589444" elapsed="0.044960">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:51:07.634508" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:51:07.634550" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.585211" elapsed="0.049362"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:51:07.634921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:51:07.634649" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-25T23:51:07.634631" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:51:07.585082" elapsed="0.049938"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:51:07.584908" elapsed="0.050142"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:51:07.582546" elapsed="0.052558"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:51:07.577926" elapsed="0.057233"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:51:07.577497" elapsed="0.057706"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:51:07.574215" elapsed="0.061040"/>
</kw>
<kw name="Perform_Test">
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:51:07.636587" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/close-session-request.msg"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/MDSAL/close-session-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:51:07.636770" level="INFO">${data} = &lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;close-session/&gt;
&lt;/rpc&gt;
</msg>
<var>${data}</var>
<arg>${datadir}${/}${name}.${dataext}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:51:07.636352" elapsed="0.000471"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-25T23:51:07.636870" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:51:07.637020" level="INFO">${request} = &lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;
    &lt;close-session/&gt;
&lt;/rpc&gt;
</msg>
<var>${request}</var>
<arg>${name}-request</arg>
<doc>Load the specified data from the data directory and return it.</doc>
<status status="PASS" start="2026-04-25T23:51:07.636049" elapsed="0.000998"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.640363" level="INFO">&lt;rpc message-id="999" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"&gt;</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:51:07.637792" elapsed="0.002627"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.641303" level="INFO">[?2004l-bash: syntax error near unexpected token `newline'</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-25T23:51:07.640592" elapsed="0.000764"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:51:07.644863" level="INFO">[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;     &lt;close-session/&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; &lt;/rpc&gt;
[?2004l-bash: syntax error near unexpected token `newline'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; 
[?2004l[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; ]]&gt;]]&gt;</msg>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-25T23:51:07.641494" elapsed="0.003432"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="PASS" start="2026-04-25T23:51:07.637481" elapsed="0.007500"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-25T23:52:07.645717" level="FAIL">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.645121" elapsed="60.001274">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:52:07.646506" elapsed="0.000043"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.637190" elapsed="60.009509">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-25T23:52:07.646766" elapsed="0.000017"/>
</return>
<var>${actual}</var>
<arg>${name}</arg>
<doc>Load a message from the data file set, send it to Netconf and return the reply.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.635758" elapsed="60.011111">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Load_Expected_Reply">
<var>${expected}</var>
<arg>${name}</arg>
<doc>Load the expected reply from the data file set and return it.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.647116" elapsed="0.000027"/>
</kw>
<kw name="Remove String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>]]&gt;]]&gt;</arg>
<doc>Removes all ``removables`` from the given ``string``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.647331" elapsed="0.000023"/>
</kw>
<kw name="Strip String" owner="String">
<var>${actual}</var>
<arg>${actual}</arg>
<arg>mode=both</arg>
<doc>Remove leading and/or trailing whitespaces from the given string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.647496" elapsed="0.000020"/>
</kw>
<kw name="Elements Should Be Equal" owner="XML">
<arg>${actual}</arg>
<arg>${expected}</arg>
<arg>normalize_whitespace=True</arg>
<doc>Verifies that the given ``source`` element is equal to ``expected``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.647670" elapsed="0.000022"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-25T23:52:07.647738" elapsed="0.000016"/>
</return>
<arg>close-session</arg>
<doc>Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.635461" elapsed="60.012383">No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</kw>
<kw name="Teardown_Test_Show_Bugs_If_Test_Failed" owner="SetupUtils" type="TEARDOWN">
<kw name="SetupUtils__Report_Bugs_Causing_Failure" owner="SetupUtils">
<if>
<branch type="IF" condition="'${SetupUtils__Known_Bug_ID}' != ''">
<kw name="Report Failure Due To Bug" owner="Utils">
<arg>${SetupUtils__Known_Bug_ID}</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="NOT RUN" start="2026-04-25T23:52:07.649575" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:07.649184" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:07.649163" elapsed="0.000512"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:07.649816" elapsed="0.000382"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.654944" level="INFO">${test_skipped} = False</msg>
<var>${test_skipped}</var>
<arg>len(re.findall('SKIPPED', """${TEST_MESSAGE}""")) &gt; 0</arg>
<arg>modules=re</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:52:07.654501" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-25T23:52:07.655189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:07.655047" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:07.655028" elapsed="0.000313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.655795" level="INFO">${newline} = 
</msg>
<var>${newline}</var>
<arg>chr(10)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:52:07.655478" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:07.656229" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_MDSAL_Northbound_Close_Session</msg>
<var>${reference}</var>
<arg>${SUITE_NAME}_${TEST_NAME}</arg>
<arg>[ /\.-]</arg>
<arg>_</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.655966" elapsed="0.000288"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-25T23:52:07.656572" level="INFO">${reference} = netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-25T23:52:07.656399" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.657123" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:07.656760" elapsed="0.000389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.657600" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:07.657292" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.658230" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-25T23:52:07.657785" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.658736" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"</msg>
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:07.658426" elapsed="0.000357"/>
</kw>
<doc>Report that a test failed and point to linked Bugzilla bug(s).
Linked bugs must contain the ${reference} inside comments (workaround
becasue of currently missing suitable field for external references and
not correctly working the CONTENT MATCHES filter).
Not FAILED (incl. SKIPPED) test are not reported.
This keyword must be used in the [Teardown] setting of the affected test
or as the first line of the test if FastFail module is not being
used. It reports the URL of the bug on console and also puts it
into the Robot log file.</doc>
<status status="PASS" start="2026-04-25T23:52:07.654207" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:07.648963" elapsed="0.009925"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-25T23:52:07.648182" elapsed="0.010747"/>
</kw>
<doc>Close the session and check that it was closed properly.</doc>
<status status="FAIL" start="2026-04-25T23:51:07.573557" elapsed="60.085413">... click for list of related bugs or create a new one if needed (with the
"netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_gate_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"

No match found for ']]&gt;]]&gt;' in 1 minute
Output:

[?2004l-bash: syntax error near unexpected token `]]'
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt; .</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Abort_ODL_Netconf_Connection">
<if>
<branch type="IF" condition="${ssh_netconf_pid} == -1">
<return>
<status status="PASS" start="2026-04-25T23:52:07.660218" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-25T23:52:07.660108" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:07.660091" elapsed="0.000210"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<var>${kill_command}</var>
<arg>kill ${ssh_netconf_pid}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.660435" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf_pid}</arg>
<arg>-1</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.660601" elapsed="0.000020"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_control}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.660772" elapsed="0.000020"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${kill_command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.660945" elapsed="0.000021"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.661097" elapsed="0.000019"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${ssh_netconf}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.661239" elapsed="0.000019"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:07.661385" elapsed="0.000019"/>
</kw>
<doc>Correctly close the Netconf connection and make sure it is really dead.</doc>
<status status="PASS" start="2026-04-25T23:52:07.659988" elapsed="0.001468"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:07.661672" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:52:07.661582" elapsed="0.000192"/>
</kw>
<doc>Close the Netconf connection and destroy all sessions in the requests library.</doc>
<status status="PASS" start="2026-04-25T23:52:07.659730" elapsed="0.002095"/>
</kw>
<doc>Metconf MDSAL Northbound test suite.

Copyright (c) 2015 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


The request produced by test cases "Get Config Running", "Get Config Running
To Confirm No_Edit Before Commit", "Get Config Running To Confirm Delete
After Commit" and "Get Config Candidate To Confirm Discard" all use the same
message id ("empty") for their requests. This is possible because the
requests produced by this suite are strictly serialized. The RFC 6241 does
not state that these IDs are unique, it only requires that each ID used is
"XML attribute normalized" if the client wants it to be returned unmodified.
The RFC specifically says that "the content of this attribute is not
interpreted in any way, it only is stored to be returned with the reply to
the request. The reuse of the "empty" string for the 4 test cases was chosen
for simplicity.

TODO: Change the 4 testcases to use unique message IDs.

TODO: There are many sections with too many "Should_[Not_]Contain" keyword
invocations (see Check_Multiple_Modules_Merge_Replace for a particularly bad
example). Create a resource that will be able to extract the data from the
requests and search for them in the response, then convert to usage of this
resource (think "Thou shall not repeat yourself"). The following resource was
found when doing research on this:
http://robotframework.org/robotframework/latest/libraries/XML.html</doc>
<status status="FAIL" start="2026-04-25T23:13:47.275944" elapsed="2300.385911"/>
</suite>
<status status="FAIL" start="2026-04-25T23:13:47.274757" elapsed="2300.388282"/>
</suite>
<suite id="s1-s4" name="CRUD" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD">
<suite id="s1-s4-s1" name="CRUD-RPC" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.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-04-25T23:52:07.755129" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:52:07.750899" elapsed="0.004279"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:52:07.750674" elapsed="0.004571"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.760064" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:52:07.756328" elapsed="0.003763"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:52:07.760290" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:07.760174" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:07.760152" elapsed="0.000206"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.760875" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:52:07.760508" elapsed="0.000409"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.761394" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:52:07.761087" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:52:07.761933" elapsed="0.000282"/>
</kw>
<msg time="2026-04-25T23:52:07.762313" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:07.762358" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:07.761581" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.762931" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:07.762545" elapsed="0.000412"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.763953" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:07.763681" elapsed="0.000301"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.764383" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:07.764130" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.764870" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.764562" elapsed="0.000334"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.768013" elapsed="0.000221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.768734" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:07.768392" elapsed="0.000368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.768912" elapsed="0.000245"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.769958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:07.769646" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:52:07.770029" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:52:07.770193" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:07.769353" elapsed="0.000865"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:07.770961" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc209a50&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:52:07.770373" elapsed="0.000734"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.771269" elapsed="0.000195"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-25T23:52:07.767437" elapsed="0.004087"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:07.767248" elapsed="0.004322"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:52:07.764952" elapsed="0.006650"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.772235" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:52:07.771830" elapsed="0.000447"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.772851" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:52:07.772437" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.773465" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:52:07.773053" elapsed="0.000454"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:52:07.763219" elapsed="0.010345"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:52:07.755992" elapsed="0.017628"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:07.773813" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:07.773701" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:07.773680" elapsed="0.000199"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.776958" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:07.776562" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.777458" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:07.777159" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:07.777527" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:07.777697" 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-04-25T23:52:07.776235" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:07.778707" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.778428" elapsed="0.000306"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:07.779530" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

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

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:07.783702" elapsed="0.000747"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.785365" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:07.784729" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:07.786541" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:07.785810" elapsed="0.000829"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:52:07.788187" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:52:07.788266" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:52:07.787909" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:07.788527" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:52:07.789818" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:52:08.361780" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:52:07 UTC 2026

  System load:  0.0                Processes:             126
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:13:51 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:52:07.789476" elapsed="0.572487"/>
</kw>
<msg time="2026-04-25T23:52:08.362055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:07.789117" elapsed="0.573033"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:52:07.787021" elapsed="0.575367"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:08.363333" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:52:08.376267" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:52:08.376608" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:52:08.376800" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:52:08.362820" elapsed="0.014079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.377184" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:08.379065" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:08.378466" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:52:08.379775" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:08.379426" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:08.379339" elapsed="0.000591"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:52:08.380334" elapsed="0.000085"/>
</return>
<status status="PASS" start="2026-04-25T23:52:08.380071" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:08.380028" elapsed="0.000543"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:52:08.380679" elapsed="0.000019"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:08.384934" elapsed="0.000565"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.385892" elapsed="0.000368"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.386610" elapsed="0.000259"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:08.381287" elapsed="0.005689"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:52:07.781554" elapsed="0.605781"/>
</kw>
<msg time="2026-04-25T23:52:08.387489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:07.780863" elapsed="0.606713"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:52:07.780326" elapsed="0.607419"/>
</kw>
<msg time="2026-04-25T23:52:08.387810" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:07.779826" elapsed="0.608051"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:08.391807" elapsed="0.000315"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.392284" elapsed="0.000211"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.392684" elapsed="0.000104"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:08.388295" elapsed="0.004546"/>
</kw>
<msg time="2026-04-25T23:52:08.392937" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:52:07.778949" elapsed="0.614012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:08.393388" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:08.393139" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:52:08.393472" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:52:07.778078" elapsed="0.615520"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:07.777904" elapsed="0.615741"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:07.777775" elapsed="0.615930"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:52:07.774095" elapsed="0.619674"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:52:08.393928" elapsed="0.000240"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:08.407955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:08.407843" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:08.407822" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:08.408352" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.408200" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:08.408920" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:08.408633" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:08.409366" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:08.409115" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:08.410262" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:52:08.409974" elapsed="0.000403">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:52:08.410484" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:08.410530" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:08.409582" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:08.410883" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:08.410628" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:08.410610" elapsed="0.000378"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:08.411759" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.411471" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:08.411832" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:08.411994" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:08.411197" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.412173" elapsed="0.000408"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:08.412875" level="INFO">index=4
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.412767" elapsed="0.000244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.413165" elapsed="0.003933"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:08.417581" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:08.418788" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:08.417314" elapsed="0.001937">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:08.422345" elapsed="0.000420"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:08.422934" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:08.423245" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:08.420082" elapsed="0.003314"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:08.419535" elapsed="0.003908"/>
</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="FAIL" start="2026-04-25T23:52:08.407538" elapsed="0.015990">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:09.441595" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:09.441440" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:09.441409" elapsed="0.000304"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:09.442159" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:09.441930" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:09.442834" level="INFO">{1: 4}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:09.442478" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:09.443288" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:09.443040" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:09.443948" elapsed="0.000199"/>
</kw>
<msg time="2026-04-25T23:52:09.444257" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:09.444303" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:09.443527" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:09.445178" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:09.446090" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:09.445887" elapsed="0.000879">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:09.445536" elapsed="0.001367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:09.447420" elapsed="0.000119"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:09.447084" elapsed="0.000558"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:09.444626" elapsed="0.003084"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:09.444401" elapsed="0.003358"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:09.444382" elapsed="0.003403"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:09.448555" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:09.448282" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:09.448627" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:52:09.448810" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:09.447994" elapsed="0.000840"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:09.449066" elapsed="0.000432"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:09.449807" level="INFO">index=6
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:09.449682" elapsed="0.000255"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:09.450097" elapsed="0.002476"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:09.453020" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:09.454225" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:09.452752" elapsed="0.001874">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:09.457740" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:09.458308" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:09.458608" elapsed="0.000116"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:09.455508" elapsed="0.003270"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:09.454950" elapsed="0.003873"/>
</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="FAIL" start="2026-04-25T23:52:09.440981" elapsed="0.017927">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:10.479340" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:10.479185" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:10.479156" elapsed="0.000287"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:10.479888" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:10.479651" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:10.480565" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:10.480224" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:10.481050" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:10.480790" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:10.481681" elapsed="0.000192"/>
</kw>
<msg time="2026-04-25T23:52:10.481984" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:10.482039" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:10.481265" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:10.482903" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:10.483826" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:10.483611" elapsed="0.000879">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:10.483283" elapsed="0.001345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:10.485177" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:10.484841" elapsed="0.000545"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:10.482367" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:10.482140" elapsed="0.003413"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:10.482120" elapsed="0.003461"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:10.486382" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:10.486105" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:10.486458" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:52:10.486622" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:10.485810" elapsed="0.000837"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:10.486825" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:10.487540" level="INFO">index=8
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:10.487435" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:10.487842" elapsed="0.002503"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:10.490794" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:10.491994" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:10.490511" elapsed="0.001870">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:10.495476" elapsed="0.000405"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:10.496042" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:10.496352" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:10.493269" elapsed="0.003235"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:10.492699" elapsed="0.003850"/>
</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="FAIL" start="2026-04-25T23:52:10.478719" elapsed="0.017916">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.514950" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.514805" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.514777" elapsed="0.000264"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.515426" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.515233" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.516055" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:11.515749" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.516496" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:11.516252" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.517102" elapsed="0.000190"/>
</kw>
<msg time="2026-04-25T23:52:11.517391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:11.517436" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.516717" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:11.518286" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.519226" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.519054" elapsed="0.000802">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.518720" elapsed="0.001273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.520492" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.520165" elapsed="0.000549"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:11.517767" elapsed="0.002995"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:11.517533" elapsed="0.003280"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.517514" elapsed="0.003326"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:11.521586" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.521317" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:11.521673" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:52:11.521832" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:11.521048" 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-04-25T23:52:11.522028" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.522723" level="INFO">index=10
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.522604" elapsed="0.000245"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.522995" elapsed="0.002405"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.525836" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:11.526903" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.525560" elapsed="0.001718">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.530332" elapsed="0.000402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.530901" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.531195" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:11.528110" elapsed="0.003234"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:11.527556" elapsed="0.003836"/>
</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="FAIL" start="2026-04-25T23:52:11.514367" elapsed="0.017107">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:11.531564" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:52:08.394942" elapsed="3.136734">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:08.394543" elapsed="3.137200"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:08.394402" elapsed="3.137383"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:52:08.394238" elapsed="3.137581"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:52:07.755538" elapsed="3.776337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.534536" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.534426" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.534407" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.539401" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.539295" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.539277" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.540418" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:11.540038" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.540912" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:11.540601" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:11.540981" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:11.541135" 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-04-25T23:52:11.539711" elapsed="0.001449"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.546649" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.546542" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.546523" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.548023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.547846" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.547827" elapsed="0.000334"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:11.548732" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.548304" elapsed="0.000470"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.549244" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:11.549006" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.551289" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.550873" elapsed="0.000931">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:11.551965" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:11.552037" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.549508" elapsed="0.002566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.554123" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.553689" elapsed="0.001007">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:11.554857" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:11.554928" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.552332" elapsed="0.002633"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.556059" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.555437" elapsed="0.000793">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:11.555122" elapsed="0.001238">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:11.555102" elapsed="0.001308">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:11.556571" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:11.556954" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:11.556788" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:11.556768" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.557182" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.559055" elapsed="0.000308"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.559566" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.559916" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:11.558382" elapsed="0.001738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:11.557440" elapsed="0.002773"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.547482" elapsed="0.012817">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</status>
</kw>
<msg time="2026-04-25T23:52:11.560401" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:11.560445" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD-RPC.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.546880" elapsed="0.013588"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.560651" elapsed="0.000191"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.560545" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.560525" elapsed="0.000370"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.561679" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.561560" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.561542" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.562204" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.561894" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.562785" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:11.562488" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.563339" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:11.563067" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.563914" elapsed="0.000359"/>
</kw>
<msg time="2026-04-25T23:52:11.564440" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:11.564486" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.563539" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:11.565770" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.567216" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.567063" elapsed="0.000586">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.566376" elapsed="0.001375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.568774" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.568019" elapsed="0.000926"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:11.564894" elapsed="0.004130"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:11.564584" elapsed="0.004490"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.564565" elapsed="0.004535"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:11.570118" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.569593" elapsed="0.000552"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:11.570232" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:11.570387" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:11.569301" elapsed="0.001150"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.570609" elapsed="0.000473"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.571355" level="INFO">index=13
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.571250" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.571624" elapsed="0.014080"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.586207" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:11.586945" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.585871" elapsed="0.001445">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.590994" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.592024" elapsed="0.000419"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.592951" elapsed="0.000304"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:11.588134" elapsed="0.005209"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:11.587586" elapsed="0.005806"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.561317" elapsed="0.032159">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:11.593873" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:11.593949" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:11.546252" elapsed="0.047801">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:11.594182" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:11.594229" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.541530" elapsed="0.052722"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:11.594576" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:11.594328" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.594310" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:11.541390" elapsed="0.053303"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:11.541215" elapsed="0.053506"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:11.539001" elapsed="0.055773"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:52:11.532492" elapsed="0.062336"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:11.532067" elapsed="0.062801"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:52:07.750350" elapsed="3.844566"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:11.595346" level="INFO">Creating Session using : alias=operational, url=http://10.30.170.206:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc33da10&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>operational</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${REST_API}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:52:11.595064" elapsed="0.000449"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.596315" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.596037" elapsed="0.000339"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.600381" 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-04-25T23:52:11.596536" elapsed="0.003889"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:11.604825" level="INFO">Creating Session using : alias=default, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfe4d01d0&gt;, timeout=2, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:52:11.604430" elapsed="0.000500"/>
</kw>
<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="PASS" start="2026-04-25T23:52:11.604020" elapsed="0.000979"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:11.600498" elapsed="0.004532"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.600479" elapsed="0.004577"/>
</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-04-25T23:52:11.610150" level="INFO">${odl_connection} = 15</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-04-25T23:52:11.609761" elapsed="0.000416"/>
</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-04-25T23:52:11.611793" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:52:11.611870" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:52:11.611514" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.612046" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.613208" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:52:11.928055" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:52:07 UTC 2026

  System load:  0.0                Processes:             126
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:52:08 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:52:11.612893" elapsed="0.315243"/>
</kw>
<msg time="2026-04-25T23:52:11.928197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.612529" elapsed="0.315725"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:52:11.611085" elapsed="0.317251"/>
</kw>
<msg time="2026-04-25T23:52:11.928384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.610699" elapsed="0.317729"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:52:11.610354" elapsed="0.318144"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:52:11.928537" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:11.928719" level="INFO">${odl} = 15</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-04-25T23:52:11.609460" elapsed="0.319285"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.937904" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:52:11.945328" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:11.928919" elapsed="0.016539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:11.945851" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-25T23:52:11.946878" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:11.946572" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:11.946525" elapsed="0.000495"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.956408" level="INFO">${tools_connection} = 16</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:11.956036" elapsed="0.000399"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:52:11.958132" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:52:11.958209" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:52:11.957863" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.958389" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:52:11.959567" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:52:12.618169" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:52:12 UTC 2026

  System load:  0.0                Processes:             103
  Usage of /:   20.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:52:11.959253" elapsed="0.659006"/>
</kw>
<msg time="2026-04-25T23:52:12.618325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.958902" elapsed="0.659484"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:52:11.957414" elapsed="0.661063"/>
</kw>
<msg time="2026-04-25T23:52:12.618526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:11.956965" elapsed="0.661607"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-25T23:52:11.956620" elapsed="0.662023"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-25T23:52:12.618709" elapsed="0.000036"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:52:11.955686" elapsed="0.663174"/>
</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-04-25T23:52:11.605307" elapsed="1.013607"/>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-04-25T23:52:11.595785" elapsed="1.023177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.619624" level="INFO">${device_type_rpc} = rpc-device</msg>
<var>${device_type_rpc}</var>
<arg>"""${USE_NETCONF_CONNECTOR}""" == """True"""</arg>
<arg>default</arg>
<arg>${device_type_rpc}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:12.619153" elapsed="0.000498"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-04-25T23:52:07.750058" elapsed="4.869677"/>
</kw>
<test id="s1-s4-s1-t1" name="Start_Testtool" line="49">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:12.623232" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:12.622939" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.624588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.624474" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.624453" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.629585" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.629477" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.629459" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.630666" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:12.630270" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.631151" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:12.630852" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:12.631231" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:52:12.631395" 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-04-25T23:52:12.629895" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.636813" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.636704" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.636684" elapsed="0.000246"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.638201" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.638092" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.638074" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:12.638790" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:12.638412" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.639238" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:12.638976" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.640233" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.639826" elapsed="0.001344">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:12.641356" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:12.641403" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.639425" elapsed="0.002003"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.642301" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.642024" elapsed="0.001343">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:12.643547" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:12.643596" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.641595" elapsed="0.002025"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.644542" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.643933" elapsed="0.000688">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:12.643713" elapsed="0.001020">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:12.643694" elapsed="0.001073">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.644926" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.645152" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:12.645013" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:12.644996" elapsed="0.000251"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.645279" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:12.648262" elapsed="0.000143"/>
</kw>
<msg time="2026-04-25T23:52:12.648475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:12.647645" 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-04-25T23:52:12.649505" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.650535" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:12.646162" elapsed="0.004593"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:12.645546" elapsed="0.005326"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.637786" elapsed="0.013172">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</status>
</kw>
<msg time="2026-04-25T23:52:12.651089" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:12.651150" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Start_Testtool"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.637084" elapsed="0.014092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.651393" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.651283" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.651262" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.652316" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:12.652209" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.652192" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.652666" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:12.652775" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:12.652533" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.653214" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:12.652953" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.653673" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:12.653409" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:12.654252" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:52:12.654796" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:12.654846" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.653890" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:12.655722" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.658020" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.657551" elapsed="0.001012">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.656121" elapsed="0.002521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:12.660308" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.659024" elapsed="0.001729"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:12.655170" elapsed="0.005705"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:12.654949" elapsed="0.005979"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.654930" elapsed="0.006025"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:12.661938" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:12.661486" elapsed="0.000481"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:12.662016" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:12.662171" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:12.661161" elapsed="0.001035"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:12.662353" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.663072" level="INFO">index=17
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:12.662965" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:12.663366" elapsed="0.002213"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.666050" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:12.667147" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.665781" elapsed="0.001770">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:12.677732" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:52:12.678112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:12.676379" elapsed="0.001880"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.678634" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.679062" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:12.668355" elapsed="0.010850"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:12.667845" elapsed="0.011420"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.651911" elapsed="0.027446">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.679704" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:12.679780" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:12.636354" elapsed="0.043530">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:12.679991" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:12.680036" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.631811" elapsed="0.048249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:12.680390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:12.680138" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.680119" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:12.631668" elapsed="0.048823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:12.631477" elapsed="0.049045"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:12.629115" elapsed="0.051461"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:12.624172" elapsed="0.056460"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:12.623697" elapsed="0.056998"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:12.620574" elapsed="0.060177"/>
</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-04-25T23:52:12.702017" 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-04-25T23:52:12.701709" elapsed="0.000335"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.702579" 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-04-25T23:52:12.702206" elapsed="0.000405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.703297" 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-04-25T23:52:12.702828" elapsed="0.000504"/>
</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-04-25T23:52:12.704607" elapsed="0.000327"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-25T23:52:12.705304" 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-04-25T23:52:12.705094" elapsed="0.000237"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:12.705904" 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-04-25T23:52:12.705493" elapsed="0.000439"/>
</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-04-25T23:52:12.724763" elapsed="0.000414"/>
</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-04-25T23:52:12.724288" elapsed="0.001040"/>
</kw>
<msg time="2026-04-25T23:52:12.725416" 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-04-25T23:52:12.715561" elapsed="0.009907"/>
</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-04-25T23:52:12.715135" elapsed="0.010411"/>
</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-04-25T23:52:12.743972" elapsed="0.000405"/>
</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-04-25T23:52:12.743506" elapsed="0.000940"/>
</kw>
<msg time="2026-04-25T23:52:12.744492" 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-04-25T23:52:12.734983" elapsed="0.009557"/>
</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-04-25T23:52:12.734588" elapsed="0.010027"/>
</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-04-25T23:52:12.764761" elapsed="0.000401"/>
</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-04-25T23:52:12.764293" elapsed="0.000937"/>
</kw>
<msg time="2026-04-25T23:52:12.765276" 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-04-25T23:52:12.755566" elapsed="0.009758"/>
</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-04-25T23:52:12.755134" elapsed="0.010265"/>
</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-04-25T23:52:12.768382" 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-04-25T23:52:12.769138" elapsed="0.000178"/>
</kw>
<msg time="2026-04-25T23:52:12.769362" 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-04-25T23:52:12.768799" elapsed="0.000611"/>
</kw>
<msg time="2026-04-25T23:52:12.769512" 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-04-25T23:52:12.768075" elapsed="0.001461"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.769819" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:12.769916" level="INFO">${current_ssh_connection} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:12.769707" elapsed="0.000236"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.774817" level="INFO">${odl_connection} = 18</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-04-25T23:52:12.774432" elapsed="0.000411"/>
</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-04-25T23:52:12.776584" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:52:12.776684" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:52:12.776290" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:12.776884" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:52:12.778550" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:52:13.088512" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:52:07 UTC 2026

  System load:  0.0                Processes:             126
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:52:11 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:52:12.777803" elapsed="0.310805"/>
</kw>
<msg time="2026-04-25T23:52:13.088728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:12.777427" elapsed="0.311360"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:52:12.775812" elapsed="0.313059"/>
</kw>
<msg time="2026-04-25T23:52:13.088921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:12.775405" elapsed="0.313561"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:52:12.775019" elapsed="0.314019"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:52:13.089078" elapsed="0.000031"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:52:12.774094" elapsed="0.315119"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.089612" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.3-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-04-25T23:52:13.121861" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.121973" level="INFO">${version} = 9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-04-25T23:52:13.122019" 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-04-25T23:52:13.089379" elapsed="0.032662"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:13.122206" elapsed="0.000223"/>
</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-04-25T23:52:13.125560" elapsed="0.000157"/>
</kw>
<msg time="2026-04-25T23:52:13.125759" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:13.125027" 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-04-25T23:52:13.125965" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:13.126124" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:13.122692" elapsed="0.003511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.126604" level="INFO">9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.126356" elapsed="0.000291"/>
</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-04-25T23:52:13.126949" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:13.126734" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.126713" elapsed="0.000313"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-04-25T23:52:13.127391" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:52:13.127436" 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-04-25T23:52:13.127165" elapsed="0.000294"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-04-25T23:52:13.127507" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:13.127729" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:52:13.127774" 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-04-25T23:52:12.767650" elapsed="0.360146"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:12.765472" elapsed="0.362368"/>
</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-04-25T23:52:13.128014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:13.127865" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:12.765452" elapsed="0.362643"/>
</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-04-25T23:52:13.128401" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:13.128188" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.128170" elapsed="0.000504"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.129203" 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-04-25T23:52:13.128825" elapsed="0.000405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.129794" 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-04-25T23:52:13.129396" elapsed="0.000425"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.130383" 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-04-25T23:52:13.129987" elapsed="0.000422"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.130971" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-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-04-25T23:52:13.130586" elapsed="0.000412"/>
</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-04-25T23:52:13.132942" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-04-25T23:52:13.226598" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.226732" 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;2026042...</msg>
<msg time="2026-04-25T23:52:13.226781" 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-04-25T23:52:13.226824" 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-04-25T23:52:13.132762" elapsed="0.094085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.227666" level="INFO">Length is 316.</msg>
<msg time="2026-04-25T23:52:13.227753" 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  43204      0 --:--:-- --:--:-- --:--:-- 43857' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-25T23:52:13.227361" elapsed="0.000474">'  % 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  43204      0 --:--:-- --:--:-- --:--:-- 43857' should be empty.</status>
</kw>
<msg time="2026-04-25T23:52:13.227940" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-25T23:52:13.227984" 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-04-25T23:52:13.227025" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.228814" 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-04-25T23:52:13.228170" elapsed="0.000671"/>
</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-04-25T23:52:13.229919" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:52:13.229670" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.230427" 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  43204      0 --:--:-- --:--:-- --:--:-- 43857</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.230187" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.230873" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.230620" elapsed="0.000296"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-25T23:52:13.229257" elapsed="0.001714"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:13.228918" elapsed="0.002089"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.228899" elapsed="0.002134"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.231191" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.231090" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.231073" elapsed="0.000189"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:52:13.231401" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-25T23:52:13.231313" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.231298" 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-04-25T23:52:13.231625" 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-04-25T23:52:13.132154" elapsed="0.099605"/>
</kw>
<msg time="2026-04-25T23:52:13.231838" 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-04-25T23:52:13.131585" elapsed="0.100302"/>
</kw>
<msg time="2026-04-25T23:52:13.232042" 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;2026042...</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-04-25T23:52:13.131199" elapsed="0.100871"/>
</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-04-25T23:52:13.234371" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:52:13.271603" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.271734" level="INFO">${stdout} = 9.0.3-20260425.052634-49</msg>
<msg time="2026-04-25T23:52:13.271807" level="INFO">${stderr} = </msg>
<msg time="2026-04-25T23:52:13.271863" 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-04-25T23:52:13.234189" elapsed="0.037698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.272683" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-25T23:52:13.272411" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:52:13.272824" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-25T23:52:13.272867" 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-04-25T23:52:13.272069" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.273462" 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-04-25T23:52:13.273053" elapsed="0.000435"/>
</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-04-25T23:52:13.274580" level="INFO">9.0.3-20260425.052634-49</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.274312" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.275056" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.274796" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.275502" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.275246" elapsed="0.000298"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-25T23:52:13.273912" elapsed="0.001686"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:13.273565" elapsed="0.002069"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.273544" elapsed="0.002131"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.275834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.275734" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.275716" elapsed="0.000209"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:52:13.276066" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-25T23:52:13.275977" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.275961" elapsed="0.000188"/>
</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-04-25T23:52:13.276288" 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-04-25T23:52:13.233586" elapsed="0.042820"/>
</kw>
<msg time="2026-04-25T23:52:13.276457" 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-04-25T23:52:13.233079" elapsed="0.043425"/>
</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-04-25T23:52:13.232614" elapsed="0.043967"/>
</kw>
<msg time="2026-04-25T23:52:13.276692" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:13.276737" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:52:13.232228" elapsed="0.044532"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.277180" level="INFO">Length is 24.</msg>
<msg time="2026-04-25T23:52:13.277254" 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-04-25T23:52:13.276920" elapsed="0.000358"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.277850" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:52:13.277436" elapsed="0.000441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.278374" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:52:13.278035" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.278808" level="INFO">netconf-testtool-9.0.3-20260425.052634-49-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.278553" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.279309" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:52:13.278999" elapsed="0.000337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.279668" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:52:13.566243" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.566868" level="INFO">${response} = </msg>
<msg time="2026-04-25T23:52:13.566983" 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-04-25T23:52:13.279491" elapsed="0.287551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.569687" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.567699" elapsed="0.002093"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:52:13.570349" elapsed="0.000100"/>
</return>
<status status="PASS" start="2026-04-25T23:52:13.569999" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.569931" elapsed="0.000667"/>
</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-04-25T23:52:13.570987" elapsed="0.000051"/>
</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-04-25T23:52:13.571409" elapsed="0.000918"/>
</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-04-25T23:52:13.572874" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:13.572515" elapsed="0.000484"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:13.572472" elapsed="0.000579"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.573123" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:52:13.573482" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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.3-SNAPSHOT/netconf-karaf-9.0.3-20260425.052634-49.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-04-25T23:52:12.703946" elapsed="0.869596"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:52:13.573735" elapsed="0.000065"/>
</return>
<msg time="2026-04-25T23:52:13.574082" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:52:12.695859" elapsed="0.878279"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.577285" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:52:13.620011" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.620491" 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-04-25T23:52:13.577175" elapsed="0.043384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.622005" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:13.621175" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.622616" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.622302" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.622236" elapsed="0.000579"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.664324" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:52:13.758462" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-04-25T23:52:13.758528" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-04-25T23:52:13.758569" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:52:13.758607" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:52:13.758646" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-04-25T23:52:13.758715" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.758755" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.758792" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.758935" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:52:13.758976" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-04-25T23:52:13.759014" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:52:13.759050" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.759086" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.623172" elapsed="0.135984"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.763245" 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-04-25T23:52:13.759411" elapsed="0.003990"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-04-25T23:52:13.763484" elapsed="0.000077"/>
</return>
<msg time="2026-04-25T23:52:13.763788" 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-04-25T23:52:13.576845" elapsed="0.186981"/>
</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-04-25T23:52:13.764930" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-25T23:52:13.764763" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.764734" elapsed="0.000317"/>
</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-04-25T23:52:13.765330" elapsed="0.000034"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.765430" elapsed="0.000021"/>
</return>
<msg time="2026-04-25T23:52:13.768414" 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-04-25T23:52:13.764296" elapsed="0.004155"/>
</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-04-25T23:52:13.770431" elapsed="0.000539"/>
</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-04-25T23:52:13.771204" elapsed="0.000429"/>
</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-04-25T23:52:13.771889" elapsed="0.000424"/>
</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-04-25T23:52:13.773891" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:52:13.786154" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:13.786393" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jan 22 23:45 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-04-25T23:52:13.786491" 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-04-25T23:52:13.773701" elapsed="0.012840"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-04-25T23:52:13.787008" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-25T23:52:13.786762" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.786714" elapsed="0.000486"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.787276" 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-04-25T23:52:13.773288" elapsed="0.014234"/>
</kw>
<msg time="2026-04-25T23:52:13.787619" 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-04-25T23:52:13.772583" elapsed="0.015185"/>
</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-04-25T23:52:13.788648" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.789056" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.788897" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:13.788858" elapsed="0.000348"/>
</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-04-25T23:52:13.789532" 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-04-25T23:52:13.789951" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.790245" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.790165" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:13.790128" elapsed="0.000255"/>
</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-04-25T23:52:13.790721" elapsed="0.000048"/>
</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-04-25T23:52:13.791127" 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-04-25T23:52:13.791516" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:52:13.791828" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.791747" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:13.791707" elapsed="0.000258"/>
</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-04-25T23:52:13.792268" elapsed="0.000044"/>
</kw>
<msg time="2026-04-25T23:52:13.792560" 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-04-25T23:52:13.769901" elapsed="0.022714"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.793773" 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.3-20260425.052634-49-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-04-25T23:52:13.792988" elapsed="0.000846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.794757" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:52:13.794178" elapsed="0.000680"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-04-25T23:52:13.794952" elapsed="0.000064"/>
</return>
<msg time="2026-04-25T23:52:13.795290" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:52:13.768794" elapsed="0.026554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.796282" 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.3-20260425.052634-49-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-04-25T23:52:13.795721" elapsed="0.000706"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.799721" level="INFO">${name} = netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC</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-04-25T23:52:13.799343" elapsed="0.000406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.802067" 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-04-25T23:52:13.799912" elapsed="0.002181"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.802459" level="INFO">${date} = 2026-04-25 23:52:13.802</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:52:13.802258" elapsed="0.000226"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.805821" level="INFO">${timestamp} = 1777161133.802</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-04-25T23:52:13.802633" elapsed="0.003216"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-04-25T23:52:13.805900" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:13.806141" level="INFO">${logfile} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC.1777161133.802.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-04-25T23:52:13.796976" elapsed="0.009191"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.810943" level="INFO">${testtool_log} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC.1777161133.802.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-04-25T23:52:13.806340" elapsed="0.004650"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.827502" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC.1777161133.802.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-04-25T23:52:13.811149" elapsed="0.016416"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.831725" 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-04-25T23:52:13.827748" elapsed="0.004023"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.832616" level="INFO">${current_Date} = 2026-04-25 23:52:13.833</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:52:13.832455" elapsed="0.000187"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.833152" level="INFO">${deadline_Date} = 2026-04-26 00:37:13.833</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-04-25T23:52:13.832808" elapsed="0.000370"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.837809" 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-04-25T23:52:13.833341" elapsed="0.004513"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.838344" 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-04-25T23:52:13.839489" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:13.839375" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.839355" elapsed="0.000198"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.839871" level="INFO">${current_Date} = 2026-04-25 23:52:13.840</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:52:13.839712" elapsed="0.000185"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-04-25T23:52:13.840366" 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-04-25T23:52:13.840046" elapsed="0.000347"/>
</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-04-25T23:52:13.840749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:13.840476" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.840458" elapsed="0.000424"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-04-25T23:52:13.839135" elapsed="0.001796"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:13.841452" 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-04-25T23:52:13.841082" elapsed="0.000396"/>
</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-04-25T23:52:13.843117" 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-04-25T23:52:13.842764" elapsed="0.000380"/>
</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-04-25T23:52:13.844935" 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-04-25T23:52:13.844153" elapsed="0.000809"/>
</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-04-25T23:52:13.847771" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:52:13.860217" level="INFO">Command exited with return code 127.</msg>
<msg time="2026-04-25T23:52:13.860352" level="INFO">${netstat_installed} = </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-04-25T23:52:13.847671" elapsed="0.012716"/>
</kw>
<if>
<branch type="IF" condition="'${netstat_installed}' is not string and '${netstat_installed}' != '0'">
<kw name="Install_Netstat" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:13.861964" level="INFO">Executing command 'sudo apt-get update'.</msg>
<msg time="2026-04-25T23:52:25.141029" level="INFO">Command exited with return code 0.</msg>
<arg>sudo apt-get update</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:52:13.861746" elapsed="11.279489"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:25.142046" level="INFO">Executing command 'sudo apt-get install -y net-tools'.</msg>
<msg time="2026-04-25T23:52:33.371402" level="INFO">Command exited with return code 0.</msg>
<arg>sudo apt-get install -y net-tools</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:52:25.141617" elapsed="8.230005"/>
</kw>
<doc>Install netstat if it is not already installed.</doc>
<status status="PASS" start="2026-04-25T23:52:13.861150" elapsed="19.510715"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:13.860529" elapsed="19.511412"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:13.860497" elapsed="19.511516"/>
</if>
<doc>Check if netstat is installed and install it if not.</doc>
<status status="PASS" start="2026-04-25T23:52:13.847384" elapsed="19.524745"/>
</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-04-25T23:52:13.846900" elapsed="19.525428"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.374110" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:52:33.423778" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:52:33.424452" 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-04-25T23:52:33.373330" elapsed="0.051210"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:52:33.424804" elapsed="0.000164"/>
</return>
<msg time="2026-04-25T23:52:33.425601" 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-04-25T23:52:13.845756" elapsed="19.579975"/>
</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-04-25T23:52:33.426374" elapsed="0.001667"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-04-25T23:52:13.845144" elapsed="19.583144"/>
</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-04-25T23:52:13.843832" elapsed="19.584572"/>
</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-04-25T23:52:13.843306" elapsed="19.585261"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:52:13.842296" elapsed="19.586436"/>
</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-04-25T23:52:13.841633" elapsed="19.587185"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.429564" 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-04-25T23:52:33.429047" elapsed="0.000554"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.430421" 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-04-25T23:52:33.429861" elapsed="0.000618"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:52:13.838545" elapsed="19.592017"/>
</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-04-25T23:52:13.838016" elapsed="19.592618"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:52:13.831980" elapsed="19.598796"/>
</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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:13.574899" elapsed="19.855952"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas</arg>
<arg>mdsal=true</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-04-25T23:52:12.680967" elapsed="20.749990"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-04-25T23:52:12.619801" elapsed="20.811334"/>
</test>
<test id="s1-s4-s1-t2" name="Check_Device_Is_Not_Configured_At_Beginning" line="56">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:33.437055" elapsed="0.000292"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:33.436673" 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-04-25T23:52:33.438900" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.438733" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.438702" elapsed="0.000293"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.444467" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.444347" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.444329" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.445535" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.445155" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.446031" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:33.445735" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:33.446101" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:33.446256" 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-04-25T23:52:33.444777" elapsed="0.001503"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.451838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.451724" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.451705" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.453123" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.453016" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.452998" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.453716" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.453334" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.454153" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.453902" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.455160" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.454743" elapsed="0.001408">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.456334" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:33.456380" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.454336" elapsed="0.002067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.457292" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.457010" elapsed="0.001312">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.458510" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:33.458555" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.456593" elapsed="0.001985"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.459502" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.458898" elapsed="0.000683">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.458674" elapsed="0.001022">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.458634" elapsed="0.001099">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.459897" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.460121" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.459982" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.459965" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.460249" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.463318" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:52:33.463537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.462580" elapsed="0.001052"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.464767" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.465842" 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-04-25T23:52:33.461126" elapsed="0.004832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.460532" elapsed="0.005540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.452713" elapsed="0.013445">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<msg time="2026-04-25T23:52:33.466260" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.466304" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.452053" elapsed="0.014305"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.466570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.466444" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.466418" elapsed="0.000260"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.467489" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.467385" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.467367" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.467865" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.467968" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.467738" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.468401" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.468144" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.468865" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.468609" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.469412" elapsed="0.000437"/>
</kw>
<msg time="2026-04-25T23:52:33.469948" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:33.469995" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.469062" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.470837" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.473073" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.472494" elapsed="0.001110">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.471228" elapsed="0.002590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.475285" elapsed="0.000355"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.474056" elapsed="0.001664"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:33.470310" elapsed="0.005511"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.470091" elapsed="0.005780"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.470073" elapsed="0.005823"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.476853" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.476416" elapsed="0.000464"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:33.476928" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:33.477081" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.476098" elapsed="0.001008"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.477259" elapsed="0.000451"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.477983" level="INFO">index=19
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.477878" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.478253" elapsed="0.002262"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.480956" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:33.483144" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.480689" elapsed="0.002827">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.496140" elapsed="0.000649"/>
</kw>
<msg time="2026-04-25T23:52:33.496850" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.494248" elapsed="0.002691"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.497267" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.497528" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.484342" elapsed="0.013618"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.483835" elapsed="0.014176"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.467092" elapsed="0.031002">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.498428" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.498502" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.451371" elapsed="0.047235">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:33.498727" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.498770" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.446690" elapsed="0.052103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.499119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.498869" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.498851" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:33.446532" elapsed="0.052691"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:33.446343" elapsed="0.052912"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:33.443991" elapsed="0.055318"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:33.438277" elapsed="0.061087"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.437635" elapsed="0.061774"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:33.432778" elapsed="0.066683"/>
</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-04-25T23:52:33.511038" 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-04-25T23:52:33.508969" elapsed="0.002096"/>
</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-04-25T23:52:33.511390" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:33.511238" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.511119" elapsed="0.000353"/>
</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-04-25T23:52:33.511785" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.511533" 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-04-25T23:52:33.512587" level="INFO">${uri} = /restconf/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-04-25T23:52:33.512093" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.511867" 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-04-25T23:52:33.512857" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.512690" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.511516" elapsed="0.001448"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.513002" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.513153" level="INFO">${uri} = /restconf/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-04-25T23:52:33.508498" elapsed="0.004680"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.513225" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:33.513365" level="INFO">${uri} = /restconf/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-04-25T23:52:33.507999" elapsed="0.005391"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.520669" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.520381" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.521111" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.520869" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:33.526019" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.523388" elapsed="0.004296">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.521221" elapsed="0.006545">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.527955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.527800" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.521202" elapsed="0.006839">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.528413" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.528575" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.528538" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.528520" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.528794" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.528862" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.516055" elapsed="0.012909">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.529034" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:33.513607" elapsed="0.015519">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.529291" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:33.529454" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.529516" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:52:33.500083" elapsed="0.029525">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.529818" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.499686" elapsed="0.030240">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:52:33.431803" elapsed="0.098264">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t3" name="Configure_Device_On_Netconf" line="61">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:33.534108" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:33.533848" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.535348" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.535238" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.535219" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.540496" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.540379" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.540360" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.541557" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.541176" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.542060" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:33.541762" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:33.542130" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.542284" 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-04-25T23:52:33.540805" elapsed="0.001503"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.547738" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.547617" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.547598" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.549015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.548909" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.548891" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.549572" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.549220" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.550017" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.549771" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.550860" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.550579" elapsed="0.001141">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.551898" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:33.551943" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.550198" elapsed="0.001769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.552839" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.552540" elapsed="0.001312">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.554026" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:33.554071" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.552131" elapsed="0.001963"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.556551" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.554384" elapsed="0.002299">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.554169" elapsed="0.002613">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.554150" elapsed="0.002671">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.556984" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.557212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.557072" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.557055" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.557340" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.560370" elapsed="0.000174"/>
</kw>
<msg time="2026-04-25T23:52:33.560618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.559668" elapsed="0.001062"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.561631" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.562795" 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-04-25T23:52:33.558217" elapsed="0.004694"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.557595" elapsed="0.005434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.548581" elapsed="0.014534">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</status>
</kw>
<msg time="2026-04-25T23:52:33.563216" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.563259" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_Device_On_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.547952" elapsed="0.015330"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.563464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.563358" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.563339" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.564315" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.564212" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.564195" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.564667" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.564772" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.564536" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.565203" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.564946" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.565631" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.565392" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.566285" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:52:33.566715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:33.566761" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.565921" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.567571" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.569831" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.569268" elapsed="0.001094">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.567979" elapsed="0.002492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.571957" elapsed="0.000353"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.570721" elapsed="0.001652"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:33.567075" elapsed="0.005399"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.566859" elapsed="0.005677"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.566840" elapsed="0.005722"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.573501" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.573100" elapsed="0.000428"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:33.573576" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.573813" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.572778" 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-04-25T23:52:33.573992" elapsed="0.000407"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.574689" level="INFO">index=20
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.574568" elapsed="0.000415"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.575131" elapsed="0.002255"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.577930" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:33.578827" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.577548" elapsed="0.001650">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.589600" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:52:33.590094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.588118" elapsed="0.002081"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.590533" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.590895" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.579984" elapsed="0.011083"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.579465" elapsed="0.011652"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.563922" elapsed="0.027277">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.591532" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.591606" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.547282" elapsed="0.044443">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:33.591830" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.591872" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.542681" elapsed="0.049214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.592218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.591971" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.591953" elapsed="0.000407"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:33.542530" elapsed="0.049854"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:33.542361" elapsed="0.050052"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:33.540017" elapsed="0.052451"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:33.534949" elapsed="0.057598"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.534517" elapsed="0.058077"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:33.531186" elapsed="0.061460"/>
</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-04-25T23:52:33.612107" elapsed="0.000430"/>
</kw>
<msg time="2026-04-25T23:52:33.612587" 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-04-25T23:52:33.611753" elapsed="0.000883"/>
</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-04-25T23:52:33.611352" elapsed="0.001375"/>
</kw>
<msg time="2026-04-25T23:52:33.612769" 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-04-25T23:52:33.602786" elapsed="0.010030"/>
</kw>
<msg time="2026-04-25T23:52:33.612919" 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-04-25T23:52:33.602443" elapsed="0.010500"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.613847" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:52:33.613104" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:52:33.646765" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:52:33.646366" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:33.647573" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:52:33.647287" elapsed="0.000357">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:33.647760" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:33.646956" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.648334" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.647948" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:33.648705" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:33.648883" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:52:33.648542" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.649310" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.649064" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.650378" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.650118" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.650870" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.650581" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.651818" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:33.651273" elapsed="0.000572"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.653116" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.652469" elapsed="0.000687"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.653271" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:52:33.653503" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:33.652031" elapsed="0.001498"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.653699" elapsed="0.000495"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:52:33.651139" elapsed="0.003097"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.655003" 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-04-25T23:52:33.654482" elapsed="0.000548"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.656292" 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-04-25T23:52:33.655816" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.656445" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:33.656722" 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-04-25T23:52:33.655213" elapsed="0.001535"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.656901" elapsed="0.000471"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:33.654351" elapsed="0.003063"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.658180" 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-04-25T23:52:33.657670" elapsed="0.000536"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.659318" 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-04-25T23:52:33.658842" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.659471" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:33.659712" 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-04-25T23:52:33.658389" elapsed="0.001349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.659891" elapsed="0.000474"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:52:33.657524" elapsed="0.002882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.661226" 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-04-25T23:52:33.660729" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.662359" 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-04-25T23:52:33.661883" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.662512" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:33.662756" 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-04-25T23:52:33.661434" elapsed="0.001348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.662933" elapsed="0.000474"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:52:33.660518" elapsed="0.002931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.664212" 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-04-25T23:52:33.663711" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.665463" 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-04-25T23:52:33.664985" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.665663" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:52:33.665894" 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-04-25T23:52:33.664420" elapsed="0.001499"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.666104" elapsed="0.000478"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:52:33.663564" elapsed="0.003062"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.667390" 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-04-25T23:52:33.666887" elapsed="0.000529"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.668527" 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-04-25T23:52:33.668052" elapsed="0.000529"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.668781" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:52:33.669010" 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-04-25T23:52:33.667598" elapsed="0.001438"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.669187" elapsed="0.000484"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:52:33.666754" elapsed="0.002961"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.670455" 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-04-25T23:52:33.669958" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.671590" 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-04-25T23:52:33.671116" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.671761" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:52:33.671988" 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-04-25T23:52:33.670678" 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-04-25T23:52:33.672165" elapsed="0.000600"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:52:33.669828" elapsed="0.002981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.673761" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:33.673054" elapsed="0.000734"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:33.674904" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.674413" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:33.675056" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:33.675279" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:33.673976" elapsed="0.001329"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.675456" elapsed="0.000492"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:52:33.672922" elapsed="0.003069"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:52:33.650951" elapsed="0.025075"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:52:33.676070" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:33.676234" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:52:33.649794" elapsed="0.026466"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.649425" elapsed="0.026867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.676467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.676319" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.649404" elapsed="0.027151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.677690" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:create-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-04-25T23:52:33.676811" elapsed="0.000908"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:33.677768" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:33.645744" elapsed="0.032149"/>
</kw>
<msg time="2026-04-25T23:52:33.677987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.633079" elapsed="0.044960"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.690692" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.703241" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.715615" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.715821" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.715993" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.716399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.716254" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.716238" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.716625" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.716806" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.716969" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:33.716209" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.716098" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.717188" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.717261" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:33.717371" level="INFO">${uri} = /restconf/operations/netconf-node-topology:create-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-04-25T23:52:33.628387" elapsed="0.089010"/>
</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-04-25T23:52:33.742124" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:52:33.741747" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:33.742882" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:52:33.742639" elapsed="0.000350">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:33.743086" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:33.742311" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.743676" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/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-04-25T23:52:33.743274" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:33.744002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:33.744149" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/usern...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:52:33.743864" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.744598" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/username&gt;
     &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.744334" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:52:33.745024" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.744733" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.745756" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:33.745247" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.745106" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.744714" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.746700" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:52:33.745995" elapsed="0.000737"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:33.746782" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:33.741128" elapsed="0.005782"/>
</kw>
<msg time="2026-04-25T23:52:33.746964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.728421" elapsed="0.018591"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.759432" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.771827" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.784251" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.784440" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.784635" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.785014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.784873" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.784858" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.785227" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.785391" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.785553" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:33.784830" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.784726" elapsed="0.000905"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.785788" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.785863" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:33.785982" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:52:33.727562" elapsed="0.058449"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:33.787257" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.787010" elapsed="0.000313">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:33.787416" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:33.786675" 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-04-25T23:52:33.787765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.787510" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.788310" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:33.788018" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.787847" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.787491" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.790756" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.788539" elapsed="0.002243"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:52:33.790833" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:33.790984" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:52:33.786341" elapsed="0.004667"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.792507" level="INFO">/restconf/operations/netconf-node-topology:create-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.792263" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.793027" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&gt;
     &lt;password&gt;topsecret&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.792783" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.793468" 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-04-25T23:52:33.793224" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.793935" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.793673" elapsed="0.000305"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.794802" 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-04-25T23:52:33.794573" elapsed="0.000256"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:52:33.795155" 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-04-25T23:52:33.794979" 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-04-25T23:52:33.795326" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.796121" 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-04-25T23:52:33.795693" elapsed="0.000473"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:52:33.796209" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.796364" 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-04-25T23:52:33.794176" elapsed="0.002213"/>
</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">
<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="NOT RUN" start="2026-04-25T23:52:33.798576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.796459" elapsed="0.002182"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:33.801865" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:52:33.798824" elapsed="0.004703">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.798681" elapsed="0.004937">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.796441" elapsed="0.007232">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.804054" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.804192" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.804155" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.804138" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.804393" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.804459" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.791329" elapsed="0.013234">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.804671" 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-04-25T23:52:33.617234" elapsed="0.187535">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:33.805100" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.804925" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.804907" elapsed="0.000284"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.805223" elapsed="0.000015"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.614276" elapsed="0.191044">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.613962" elapsed="0.191425">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.805669" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.805418" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.613943" elapsed="0.191817">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:52:33.805911" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type_rpc_create}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.592932" elapsed="0.213092">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:52:33.530561" elapsed="0.275627">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t4" name="Check_ODL_Has_Netconf_Connector_For_Device" 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-04-25T23:52:33.810381" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:33.810122" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.811625" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.811517" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.811499" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.816857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.816749" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.816730" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.817918" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.817518" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.818391" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:33.818100" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:33.818461" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:33.818612" 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-04-25T23:52:33.817147" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.824119" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.824012" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.823993" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.825427" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.825322" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.825304" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.826013" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.825634" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.826440" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.826195" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.827297" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.827021" elapsed="0.001155">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.828354" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:33.828399" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.826621" elapsed="0.001801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.829297" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.829021" elapsed="0.001277">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.830474" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:33.830519" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.828585" elapsed="0.001957"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.831447" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.830857" elapsed="0.000825">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.830617" elapsed="0.001164">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.830598" elapsed="0.001218">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.831976" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.832201" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.832063" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.832045" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.832327" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.835412" elapsed="0.000146"/>
</kw>
<msg time="2026-04-25T23:52:33.835628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.834631" elapsed="0.001120"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.837039" elapsed="0.000055"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.838066" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.833196" elapsed="0.004990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.832587" elapsed="0.005715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.825020" elapsed="0.013373">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<msg time="2026-04-25T23:52:33.838499" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.838543" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.824332" elapsed="0.014434"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.838971" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.838855" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.838834" 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-04-25T23:52:33.839876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.839766" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.839748" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.840216" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.840318" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.840090" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.840791" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.840494" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.841222" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.840983" 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-04-25T23:52:33.841794" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:52:33.842211" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:33.842257" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.841419" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.843200" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.845312" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.844893" elapsed="0.000989">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.843592" elapsed="0.002367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.847443" elapsed="0.000408"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.846191" elapsed="0.001722"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:33.842570" elapsed="0.005444"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.842353" elapsed="0.005712"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.842335" elapsed="0.005756"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.849134" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.848615" elapsed="0.000545"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:33.849208" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:33.849361" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.848293" elapsed="0.001092"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.849536" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.850249" level="INFO">index=21
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.850144" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.850517" elapsed="0.002457"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.853391" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:33.854252" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.853132" elapsed="0.001488">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.864998" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:52:33.865390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.863538" elapsed="0.001940"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.865985" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.866244" elapsed="0.000053"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.855622" elapsed="0.010801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.855108" elapsed="0.011363"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.839443" elapsed="0.027110">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.867155" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.867230" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.823670" elapsed="0.043665">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:33.867441" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.867485" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.819058" elapsed="0.048450"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.867851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.867585" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.867567" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:33.818919" elapsed="0.049032"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:33.818741" elapsed="0.049243"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:33.816344" elapsed="0.051697"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:33.811233" elapsed="0.056863"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.810814" elapsed="0.057328"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:33.807419" elapsed="0.060776"/>
</kw>
<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-04-25T23:52:33.879076" 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-04-25T23:52:33.877000" elapsed="0.002102"/>
</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-04-25T23:52:33.879425" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:33.879277" elapsed="0.000203"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.879156" elapsed="0.000350"/>
</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-04-25T23:52:33.879815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.879565" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.880589" level="INFO">${uri} = /restconf/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-04-25T23:52:33.880118" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.879894" 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-04-25T23:52:33.880863" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.880700" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.879549" elapsed="0.001387"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.881002" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.881154" level="INFO">${uri} = /restconf/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-04-25T23:52:33.876515" elapsed="0.004664"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.881224" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:33.881370" level="INFO">${uri} = /restconf/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-04-25T23:52:33.876034" elapsed="0.005360"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.888800" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.888528" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.889234" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.888995" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:33.893959" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.891393" elapsed="0.004184">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.889342" elapsed="0.006336">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.895866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.895713" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.889325" elapsed="0.006628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.896326" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.896456" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.896421" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.896405" elapsed="0.000111"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.896684" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.896755" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.884203" elapsed="0.012654">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.896926" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:33.881611" elapsed="0.015406">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.897181" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:33.897345" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.897406" elapsed="0.000014"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:52:33.868432" elapsed="0.029065">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.897703" elapsed="0.000023"/>
</kw>
<doc>Get the list of configured devices and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:52:33.806707" elapsed="0.091162">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t5" name="Wait_For_Device_To_Become_Connected" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:33.901736" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:33.901462" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.902972" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.902864" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.902846" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.908227" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.908121" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.908104" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.909308" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:33.908929" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.909799" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:33.909491" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:33.909870" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:33.910023" 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-04-25T23:52:33.908516" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.915508" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.915399" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.915381" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.916858" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.916748" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.916730" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.917418" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.917065" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.917854" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.917597" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.918692" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.918415" elapsed="0.001116">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.919725" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:33.919771" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.918035" elapsed="0.001763"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.920617" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.920348" elapsed="0.001282">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:33.921830" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:33.921875" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.919962" elapsed="0.001936"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.924427" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.922188" elapsed="0.002322">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.921973" elapsed="0.002663">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.921954" elapsed="0.002754">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.924874" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.925101" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.924962" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.924945" elapsed="0.000254"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.925232" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.928249" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:52:33.928468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.927516" 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-04-25T23:52:33.929793" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.930729" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.926096" elapsed="0.004749"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.925488" elapsed="0.005472"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.916395" elapsed="0.014650">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</status>
</kw>
<msg time="2026-04-25T23:52:33.931147" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.931191" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Become_Connected"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.915738" elapsed="0.015476"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.931396" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.931290" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.931271" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.932248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.932145" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.932128" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.932569" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.932708" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:33.932457" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.933140" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.932885" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.933568" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.933330" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.934171" elapsed="0.000311"/>
</kw>
<msg time="2026-04-25T23:52:33.934580" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:33.934625" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.933820" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.935457" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.937532" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.937117" elapsed="0.001092">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.935861" elapsed="0.002424"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.939777" elapsed="0.000351"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.938515" elapsed="0.001742"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:33.934959" elapsed="0.005402"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.934738" elapsed="0.005675"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.934720" elapsed="0.005718"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:33.941404" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.941001" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:33.941480" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:33.941630" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.940638" elapsed="0.001102"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.941896" elapsed="0.000405"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.942570" level="INFO">index=22
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:33.942466" elapsed="0.000415"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:33.943027" elapsed="0.002241"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:33.945807" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:33.946687" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.945427" elapsed="0.001630">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:33.957299" elapsed="0.000312"/>
</kw>
<msg time="2026-04-25T23:52:33.957796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:33.955960" elapsed="0.001939"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.958226" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.958482" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:33.947845" elapsed="0.010775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:33.947322" elapsed="0.011362"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.931856" elapsed="0.026911">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.959096" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.959173" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.915061" elapsed="0.044214">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:33.959378" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:33.959420" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.910405" elapsed="0.049038"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.960069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.959519" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.959501" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:33.910267" elapsed="0.049902"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:33.910098" elapsed="0.050100"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:33.907762" elapsed="0.052522"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:33.902559" elapsed="0.057781"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:33.902143" elapsed="0.058241"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:33.899146" elapsed="0.061288"/>
</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-04-25T23:52:33.972522" 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-04-25T23:52:33.970293" elapsed="0.002255"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.973254" 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-04-25T23:52:33.972930" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:33.972773" elapsed="0.000543"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.973877" 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-04-25T23:52:33.973541" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:33.973394" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:33.972603" 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-04-25T23:52:33.974267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.974030" 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-04-25T23:52:33.975070" level="INFO">${uri} = /restconf/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-04-25T23:52:33.974582" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:33.974347" 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-04-25T23:52:33.975317" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.975157" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:33.974013" elapsed="0.001378"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.975424" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:33.975572" level="INFO">${uri} = /restconf/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-04-25T23:52:33.969844" elapsed="0.005754"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:33.975644" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:52:33.975804" level="INFO">${uri} = /restconf/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-04-25T23:52:33.969284" elapsed="0.006544"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.983103" level="INFO">/restconf/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-04-25T23:52:33.982854" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:33.983545" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:33.983305" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:33.988149" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.985741" elapsed="0.004087">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:33.983676" elapsed="0.006233">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.990130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:33.989975" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:33.983642" elapsed="0.006575">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.990580" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.990730" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:33.990692" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:33.990674" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:33.990933" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.991002" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.978491" elapsed="0.012613">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:33.991173" 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-04-25T23:52:33.976048" elapsed="0.015219">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:33.991433" 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-04-25T23:52:33.961608" elapsed="0.029933">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:35.011175" 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-04-25T23:52:35.008449" elapsed="0.002758"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:35.011981" 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-04-25T23:52:35.011574" elapsed="0.000435"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:35.011417" elapsed="0.000628"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:35.012597" 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-04-25T23:52:35.012276" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:35.012127" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:35.011276" 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-04-25T23:52:35.013040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:35.012776" 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-04-25T23:52:35.013855" level="INFO">${uri} = /restconf/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-04-25T23:52:35.013362" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:35.013120" 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-04-25T23:52:35.014108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:35.013945" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:35.012756" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:35.014222" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:52:35.014454" level="INFO">${uri} = /restconf/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-04-25T23:52:35.007783" elapsed="0.006698"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:35.014529" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:35.014690" level="INFO">${uri} = /restconf/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-04-25T23:52:35.006969" elapsed="0.007749"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:35.022139" level="INFO">/restconf/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-04-25T23:52:35.021872" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:35.022581" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:35.022338" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:35.027701" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:35.024773" elapsed="0.004638">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:35.022709" elapsed="0.006786">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:35.029698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:35.029530" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:35.022689" elapsed="0.007098">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:35.030163" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:35.030294" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:35.030258" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:35.030242" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:35.030495" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:35.030564" 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-04-25T23:52:35.017459" elapsed="0.013223">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:35.030754" 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-04-25T23:52:35.014949" elapsed="0.015905">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:35.031020" 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-04-25T23:52:34.992346" elapsed="0.038783">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:36.049591" 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-04-25T23:52:36.047414" elapsed="0.002210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:36.050453" 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-04-25T23:52:36.050117" elapsed="0.000364"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:36.049956" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:36.051115" 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-04-25T23:52:36.050777" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:36.050602" elapsed="0.000577"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:36.049711" elapsed="0.001498"/>
</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-04-25T23:52:36.051568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:36.051283" 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-04-25T23:52:36.052402" level="INFO">${uri} = /restconf/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-04-25T23:52:36.051918" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:36.051669" 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-04-25T23:52:36.052675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:36.052494" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:36.051262" elapsed="0.001493"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:36.052794" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:52:36.052965" level="INFO">${uri} = /restconf/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-04-25T23:52:36.046925" elapsed="0.006068"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:36.053041" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:36.053189" level="INFO">${uri} = /restconf/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-04-25T23:52:36.046267" 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-04-25T23:52:36.060637" level="INFO">/restconf/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-04-25T23:52:36.060374" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:36.061116" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:36.060859" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:36.066304" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:36.063395" elapsed="0.004640">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:36.061228" elapsed="0.006900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:36.068317" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:36.068164" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:36.061210" elapsed="0.007195">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:36.068804" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:36.068996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:36.068958" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:36.068940" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:36.069206" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:36.069279" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:36.055992" elapsed="0.013396">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:36.069462" 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-04-25T23:52:36.053446" elapsed="0.016114">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:36.069755" 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-04-25T23:52:36.032043" elapsed="0.037864">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:37.087042" 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-04-25T23:52:37.084797" elapsed="0.002279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:37.087821" 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-04-25T23:52:37.087468" elapsed="0.000381"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:37.087309" elapsed="0.000576"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:37.088496" 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-04-25T23:52:37.088142" elapsed="0.000382"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:37.087988" elapsed="0.000572"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:37.087146" 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-04-25T23:52:37.088942" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:37.088676" 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-04-25T23:52:37.089809" level="INFO">${uri} = /restconf/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-04-25T23:52:37.089290" elapsed="0.000546"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:37.089045" elapsed="0.000828"/>
</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-04-25T23:52:37.090085" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:37.089899" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:37.088640" elapsed="0.001531"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:37.090208" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:52:37.090436" level="INFO">${uri} = /restconf/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-04-25T23:52:37.084293" elapsed="0.006172"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:37.090515" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:37.090683" level="INFO">${uri} = /restconf/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-04-25T23:52:37.083633" elapsed="0.007077"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:37.098356" level="INFO">/restconf/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-04-25T23:52:37.098052" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:37.098849" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:37.098574" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:37.103976" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:37.101071" elapsed="0.004707">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:37.098966" elapsed="0.006900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:37.106053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:37.105902" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:37.098947" elapsed="0.007194">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:37.106551" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:37.106734" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:37.106694" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:37.106673" 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-04-25T23:52:37.106948" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:37.107019" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:37.093575" elapsed="0.013551">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:37.107198" 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-04-25T23:52:37.090938" elapsed="0.016373">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:37.107494" 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-04-25T23:52:37.070841" elapsed="0.036778">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:38.127095" 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-04-25T23:52:38.124610" elapsed="0.002519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:38.127889" 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-04-25T23:52:38.127514" elapsed="0.000416"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:38.127356" elapsed="0.000716"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:38.129005" 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-04-25T23:52:38.128504" elapsed="0.000538"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:38.128291" elapsed="0.000801"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:38.127205" elapsed="0.001928"/>
</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-04-25T23:52:38.129604" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:38.129235" 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-04-25T23:52:38.130767" level="INFO">${uri} = /restconf/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-04-25T23:52:38.130078" elapsed="0.000727"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:38.129750" elapsed="0.001148"/>
</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-04-25T23:52:38.131166" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:38.130936" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:38.129205" elapsed="0.002122"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:38.131383" elapsed="0.000052"/>
</return>
<msg time="2026-04-25T23:52:38.131622" level="INFO">${uri} = /restconf/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-04-25T23:52:38.123976" elapsed="0.007708"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:38.131755" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:52:38.131944" level="INFO">${uri} = /restconf/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-04-25T23:52:38.123228" elapsed="0.008740"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:38.139385" level="INFO">/restconf/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-04-25T23:52:38.139123" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:38.139861" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:38.139590" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:38.144987" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:38.142042" elapsed="0.004652">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:38.139972" elapsed="0.006808">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:38.147009" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:38.146816" elapsed="0.000261"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:38.139954" elapsed="0.007147">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:38.147477" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:38.147617" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:38.147579" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:38.147562" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:38.147842" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:38.147921" 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-04-25T23:52:38.134706" elapsed="0.013359">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:38.148137" 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-04-25T23:52:38.132194" elapsed="0.016038">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:38.148400" 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-04-25T23:52:38.109252" elapsed="0.039259">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:39.168646" 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-04-25T23:52:39.166494" elapsed="0.002198"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:39.169378" 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-04-25T23:52:39.169051" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:39.168898" elapsed="0.000543"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:39.170004" 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-04-25T23:52:39.169683" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:39.169521" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:39.168758" elapsed="0.001337"/>
</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-04-25T23:52:39.170424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:39.170165" 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-04-25T23:52:39.171220" level="INFO">${uri} = /restconf/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-04-25T23:52:39.170749" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:39.170505" 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-04-25T23:52:39.171484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:39.171309" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:39.170146" elapsed="0.001414"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:39.171596" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:52:39.171769" level="INFO">${uri} = /restconf/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-04-25T23:52:39.166014" elapsed="0.005781"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:39.171842" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:39.171992" level="INFO">${uri} = /restconf/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-04-25T23:52:39.165427" elapsed="0.006591"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:39.179309" level="INFO">/restconf/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-04-25T23:52:39.179051" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:39.179776" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:39.179518" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:39.184858" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:39.181937" elapsed="0.004655">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:39.179886" elapsed="0.006811">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:39.186885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:39.186733" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:39.179868" elapsed="0.007105">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:39.187345" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:39.187495" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:39.187457" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:39.187440" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:39.187714" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:39.187785" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:39.174707" elapsed="0.013183">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:39.187966" 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-04-25T23:52:39.172240" elapsed="0.015822">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:39.188229" 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-04-25T23:52:39.149326" elapsed="0.039012">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:40.206947" 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-04-25T23:52:40.204742" elapsed="0.002237"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:40.207682" 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-04-25T23:52:40.207337" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:40.207184" elapsed="0.000563"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:40.208318" 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-04-25T23:52:40.207991" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:40.207827" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:40.207045" 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-04-25T23:52:40.208753" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:40.208480" 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-04-25T23:52:40.209605" level="INFO">${uri} = /restconf/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-04-25T23:52:40.209073" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:40.208837" elapsed="0.000848"/>
</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-04-25T23:52:40.209876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:40.209712" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:40.208460" elapsed="0.001493"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:40.209989" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:52:40.210147" level="INFO">${uri} = /restconf/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-04-25T23:52:40.204068" elapsed="0.006105"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:40.210221" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:40.210366" level="INFO">${uri} = /restconf/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-04-25T23:52:40.203229" elapsed="0.007163"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:40.217731" level="INFO">/restconf/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-04-25T23:52:40.217459" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:40.218171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:40.217929" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:40.223189" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:40.220500" elapsed="0.004392">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:40.218281" elapsed="0.006695">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:40.225162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:40.225011" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:40.218262" elapsed="0.006988">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:40.225612" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:40.225761" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:40.225724" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:40.225706" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:40.225961" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:40.226030" 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-04-25T23:52:40.213107" elapsed="0.013026">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:40.226204" 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-04-25T23:52:40.210616" elapsed="0.015683">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:40.226502" 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-04-25T23:52:40.189824" elapsed="0.036790">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:41.244793" 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-04-25T23:52:41.241783" elapsed="0.003051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:41.245553" 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-04-25T23:52:41.245228" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:41.245077" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:41.246184" 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-04-25T23:52:41.245861" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:41.245712" elapsed="0.000535"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:41.244920" 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-04-25T23:52:41.246591" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:41.246343" 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-04-25T23:52:41.247380" level="INFO">${uri} = /restconf/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-04-25T23:52:41.246916" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:41.246688" elapsed="0.000753"/>
</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-04-25T23:52:41.247626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:41.247466" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:41.246324" elapsed="0.001392"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:41.247752" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:52:41.247906" level="INFO">${uri} = /restconf/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-04-25T23:52:41.241120" elapsed="0.006812"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:41.247977" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:41.248116" level="INFO">${uri} = /restconf/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-04-25T23:52:41.240202" elapsed="0.007939"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:41.255631" level="INFO">/restconf/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-04-25T23:52:41.255378" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:41.256087" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:41.255845" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:41.260682" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:41.258276" elapsed="0.004055">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:41.256197" elapsed="0.006216">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:41.262646" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:41.262491" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:41.256178" elapsed="0.006573">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:41.263128" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:41.263260" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:41.263223" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:41.263206" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:41.263462" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:41.263532" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:41.251034" elapsed="0.012601">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:41.263722" 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-04-25T23:52:41.248359" elapsed="0.015459">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:41.263986" 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-04-25T23:52:41.227324" elapsed="0.036772">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:42.286087" 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-04-25T23:52:42.282766" elapsed="0.003366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:42.287116" 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-04-25T23:52:42.286640" elapsed="0.000513"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:42.286427" elapsed="0.000776"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:42.287987" 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-04-25T23:52:42.287521" elapsed="0.000502"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:42.287314" elapsed="0.000758"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:42.286228" elapsed="0.001888"/>
</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-04-25T23:52:42.288568" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:42.288217" elapsed="0.000449"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:42.289743" level="INFO">${uri} = /restconf/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-04-25T23:52:42.289057" elapsed="0.000724"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:42.288704" elapsed="0.001126"/>
</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-04-25T23:52:42.290085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:42.289864" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:42.288188" elapsed="0.001973"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:42.290199" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:52:42.290423" level="INFO">${uri} = /restconf/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-04-25T23:52:42.282073" elapsed="0.008377"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:42.290499" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:42.290642" level="INFO">${uri} = /restconf/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-04-25T23:52:42.280417" elapsed="0.010266"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:42.297992" level="INFO">/restconf/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-04-25T23:52:42.297734" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:42.298430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:42.298189" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:42.303253" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:42.300606" elapsed="0.004357">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:42.298539" elapsed="0.006550">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:42.305277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:42.305125" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:42.298521" elapsed="0.006849">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:42.305770" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:42.305901" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:42.305865" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:42.305848" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:42.306100" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:42.306168" 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-04-25T23:52:42.293392" elapsed="0.012880">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:42.306342" 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-04-25T23:52:42.290917" elapsed="0.015518">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:42.306601" 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-04-25T23:52:42.265011" elapsed="0.041715">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:43.325335" 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-04-25T23:52:43.323144" elapsed="0.002225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:43.326112" 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-04-25T23:52:43.325782" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:43.325611" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:43.326738" 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-04-25T23:52:43.326406" elapsed="0.000359"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:43.326257" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:43.325447" 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-04-25T23:52:43.327175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:43.326907" 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-04-25T23:52:43.327967" level="INFO">${uri} = /restconf/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-04-25T23:52:43.327485" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:43.327258" 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-04-25T23:52:43.328216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:43.328055" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:43.326885" elapsed="0.001406"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:43.328330" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:52:43.328500" level="INFO">${uri} = /restconf/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-04-25T23:52:43.322633" elapsed="0.005893"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:43.328573" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:43.329051" level="INFO">${uri} = /restconf/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-04-25T23:52:43.322034" elapsed="0.007046"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:43.336394" level="INFO">/restconf/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-04-25T23:52:43.336133" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:43.336851" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:43.336590" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:43.341969" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:43.339048" elapsed="0.004659">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:43.336961" elapsed="0.006834">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:43.343980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:43.343829" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:43.336942" elapsed="0.007130">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:43.344449" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:43.344708" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:43.344668" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:43.344634" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:43.344913" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:43.344982" 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-04-25T23:52:43.331810" elapsed="0.013278">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:43.345159" 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-04-25T23:52:43.329309" elapsed="0.015943">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:43.345417" 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-04-25T23:52:43.307588" elapsed="0.037936">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:44.362893" 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-04-25T23:52:44.360687" elapsed="0.002241"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:44.363664" 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-04-25T23:52:44.363320" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:44.363162" elapsed="0.000567"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:44.364296" 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-04-25T23:52:44.363967" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:44.363815" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:44.363008" 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-04-25T23:52:44.364749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:44.364465" 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-04-25T23:52:44.365530" level="INFO">${uri} = /restconf/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-04-25T23:52:44.365062" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:44.364834" 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-04-25T23:52:44.365793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:44.365617" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:44.364443" elapsed="0.001427"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:44.365909" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:52:44.366122" level="INFO">${uri} = /restconf/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-04-25T23:52:44.360181" elapsed="0.005978"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:44.366220" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:44.366367" level="INFO">${uri} = /restconf/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-04-25T23:52:44.359563" 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-04-25T23:52:44.373840" level="INFO">/restconf/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-04-25T23:52:44.373564" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:44.374306" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:44.374037" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:44.379304" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:44.376543" elapsed="0.004522">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:44.374415" elapsed="0.006741">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:44.381342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:44.381190" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:44.374396" elapsed="0.007032">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:44.381823" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:44.381954" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:44.381918" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:44.381902" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:44.382188" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:44.382259" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:44.369191" elapsed="0.013190">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:44.382451" 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-04-25T23:52:44.366615" elapsed="0.015931">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:44.382731" 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-04-25T23:52:44.346437" elapsed="0.036404">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:45.398964" 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-04-25T23:52:45.396770" elapsed="0.002227"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:45.399711" 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-04-25T23:52:45.399370" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:45.399214" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:45.400427" 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-04-25T23:52:45.400065" elapsed="0.000389"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:45.399912" elapsed="0.000577"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:45.399068" elapsed="0.001450"/>
</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-04-25T23:52:45.400873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:45.400591" 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-04-25T23:52:45.401671" level="INFO">${uri} = /restconf/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-04-25T23:52:45.401187" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:45.400957" 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-04-25T23:52:45.401925" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:45.401762" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:45.400570" elapsed="0.001431"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:45.402039" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:52:45.402199" level="INFO">${uri} = /restconf/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-04-25T23:52:45.396271" elapsed="0.005955"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:45.402274" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:45.402419" level="INFO">${uri} = /restconf/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-04-25T23:52:45.395686" 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-04-25T23:52:45.409844" level="INFO">/restconf/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-04-25T23:52:45.409567" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:45.410291" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:45.410046" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:45.415380" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:45.412488" elapsed="0.006628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:45.410403" elapsed="0.008900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:45.419749" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:45.419378" elapsed="0.000515"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:45.410384" elapsed="0.009561">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:45.420824" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:45.421120" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:45.421038" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:45.421001" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:45.421571" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:45.421756" 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-04-25T23:52:45.405180" elapsed="0.016884">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:45.422228" 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-04-25T23:52:45.402695" elapsed="0.019745">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:45.422861" 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-04-25T23:52:45.383636" elapsed="0.039473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:46.441030" 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-04-25T23:52:46.438303" elapsed="0.002768"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:46.441798" 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-04-25T23:52:46.441456" elapsed="0.000369"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:46.441298" elapsed="0.000563"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:46.442407" 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-04-25T23:52:46.442091" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:46.441942" elapsed="0.000526"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:46.441149" 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-04-25T23:52:46.442849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:46.442569" 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-04-25T23:52:46.443663" level="INFO">${uri} = /restconf/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-04-25T23:52:46.443175" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:46.442932" 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-04-25T23:52:46.443916" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:46.443754" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:46.442549" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:46.444029" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:52:46.444195" level="INFO">${uri} = /restconf/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-04-25T23:52:46.437606" elapsed="0.006616"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:46.444270" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:46.444414" level="INFO">${uri} = /restconf/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-04-25T23:52:46.436740" elapsed="0.007700"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:46.451904" level="INFO">/restconf/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-04-25T23:52:46.451630" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:46.452345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:46.452102" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:46.457589" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:46.454603" elapsed="0.004776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:46.452456" elapsed="0.007008">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:46.459667" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:46.459500" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:46.452437" elapsed="0.007319">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:46.460125" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:46.460263" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:46.460226" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:46.460209" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:46.460468" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:46.460543" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:46.447221" elapsed="0.013441">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:46.460737" 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-04-25T23:52:46.444679" elapsed="0.016153">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:46.461001" 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-04-25T23:52:46.424062" elapsed="0.037049">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:47.478943" 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-04-25T23:52:47.476786" elapsed="0.002189"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:47.479702" 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-04-25T23:52:47.479341" elapsed="0.000390"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:47.479186" elapsed="0.000581"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:47.480319" 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-04-25T23:52:47.479999" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:47.479848" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:47.479044" 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-04-25T23:52:47.480755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:47.480478" 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-04-25T23:52:47.481608" level="INFO">${uri} = /restconf/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-04-25T23:52:47.481065" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:47.480835" 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-04-25T23:52:47.481879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:47.481716" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:47.480458" elapsed="0.001497"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:47.481992" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:52:47.482152" level="INFO">${uri} = /restconf/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-04-25T23:52:47.476288" elapsed="0.005895"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:47.482231" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:47.482376" level="INFO">${uri} = /restconf/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-04-25T23:52:47.475682" elapsed="0.006720"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:47.489797" level="INFO">/restconf/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-04-25T23:52:47.489526" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:47.490306" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:47.490063" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:47.495308" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:47.492637" elapsed="0.004389">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:47.490416" elapsed="0.006696">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:47.497296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:47.497146" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:47.490397" elapsed="0.006985">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:47.497765" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:47.497896" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:47.497860" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:47.497843" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:47.498095" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:47.498163" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:47.485141" elapsed="0.013131">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:47.498342" 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-04-25T23:52:47.482625" elapsed="0.015809">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:47.498639" elapsed="0.000038"/>
</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-04-25T23:52:47.462711" elapsed="0.036056">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:48.515991" 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-04-25T23:52:48.513804" elapsed="0.002221"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:48.516786" 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-04-25T23:52:48.516439" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:48.516283" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:48.517396" 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-04-25T23:52:48.517079" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:48.516930" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:48.516102" 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-04-25T23:52:48.517856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:48.517569" 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-04-25T23:52:48.518641" level="INFO">${uri} = /restconf/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-04-25T23:52:48.518170" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:48.517939" 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-04-25T23:52:48.518907" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:48.518744" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:48.517546" elapsed="0.001436"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:48.519026" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:52:48.519201" level="INFO">${uri} = /restconf/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-04-25T23:52:48.513296" elapsed="0.005931"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:48.519273" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:48.519414" level="INFO">${uri} = /restconf/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-04-25T23:52:48.512698" elapsed="0.006742"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:48.527065" level="INFO">/restconf/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-04-25T23:52:48.526805" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:48.527515" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:48.527273" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:48.532381" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:48.529712" elapsed="0.004404">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:48.527625" elapsed="0.006577">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:48.534449" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:48.534293" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:48.527606" elapsed="0.006932">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:48.534931" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:48.535063" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:48.535026" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:48.535009" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:48.535263" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:48.535333" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:48.522410" elapsed="0.013029">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:48.535511" 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-04-25T23:52:48.519680" elapsed="0.015925">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:48.535791" 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-04-25T23:52:48.499636" elapsed="0.036265">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:49.552696" 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-04-25T23:52:49.550285" elapsed="0.002446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:49.553453" 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-04-25T23:52:49.553119" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:49.552964" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:49.554083" 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-04-25T23:52:49.553764" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:49.553599" elapsed="0.000546"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:49.552815" 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-04-25T23:52:49.554510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:49.554248" 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-04-25T23:52:49.555300" level="INFO">${uri} = /restconf/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-04-25T23:52:49.554837" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:49.554592" 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-04-25T23:52:49.555546" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:49.555386" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:49.554226" elapsed="0.001395"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:49.555673" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:52:49.555907" level="INFO">${uri} = /restconf/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-04-25T23:52:49.549800" elapsed="0.006133"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:49.555982" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:49.556125" level="INFO">${uri} = /restconf/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-04-25T23:52:49.549162" elapsed="0.006988"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:49.563447" level="INFO">/restconf/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-04-25T23:52:49.563193" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:49.564043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:49.563642" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:49.568765" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:49.566222" elapsed="0.004215">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:49.564154" elapsed="0.006367">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:49.570724" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:49.570556" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:49.564135" elapsed="0.006677">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:49.571177" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:49.571308" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:49.571271" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:49.571254" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:49.571507" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:49.571575" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:49.558883" elapsed="0.012813">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:49.571768" 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-04-25T23:52:49.556370" elapsed="0.015492">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:49.572027" 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-04-25T23:52:49.536805" elapsed="0.035329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:50.591708" 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-04-25T23:52:50.589154" elapsed="0.002592"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:50.592467" 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-04-25T23:52:50.592138" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:50.591982" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:50.593097" 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-04-25T23:52:50.592779" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:50.592615" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:50.591827" 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-04-25T23:52:50.593560" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:50.593274" 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-04-25T23:52:50.594362" level="INFO">${uri} = /restconf/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-04-25T23:52:50.593890" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:50.593643" 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-04-25T23:52:50.594612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:50.594450" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:50.593249" elapsed="0.001454"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:50.594750" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:52:50.594923" level="INFO">${uri} = /restconf/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-04-25T23:52:50.588461" elapsed="0.006488"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:50.594996" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:50.595138" level="INFO">${uri} = /restconf/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-04-25T23:52:50.587627" elapsed="0.007536"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:50.602599" level="INFO">/restconf/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-04-25T23:52:50.602342" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:50.603058" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:50.602818" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:50.607798" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:50.605209" elapsed="0.004310">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:50.603167" elapsed="0.006438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:50.609805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:50.609638" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:50.603148" elapsed="0.006743">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:50.610262" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:50.610449" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:50.610412" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:50.610394" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:50.610663" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:50.610734" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:50.597886" elapsed="0.012955">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:50.610913" 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-04-25T23:52:50.595387" elapsed="0.015620">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:50.611177" 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-04-25T23:52:50.573067" elapsed="0.038217">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:51.631340" 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-04-25T23:52:51.629128" elapsed="0.002247"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:51.632098" 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-04-25T23:52:51.631771" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:51.631600" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:51.632728" 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-04-25T23:52:51.632390" elapsed="0.000365"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:51.632242" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:51.631452" 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-04-25T23:52:51.633164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:51.632896" 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-04-25T23:52:51.633978" level="INFO">${uri} = /restconf/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-04-25T23:52:51.633474" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:51.633247" 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-04-25T23:52:51.634224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:51.634066" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:51.632874" elapsed="0.001426"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:51.634339" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:52:51.634503" level="INFO">${uri} = /restconf/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-04-25T23:52:51.628619" elapsed="0.005909"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:51.634575" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:51.634733" level="INFO">${uri} = /restconf/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-04-25T23:52:51.628024" 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-04-25T23:52:51.642144" level="INFO">/restconf/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-04-25T23:52:51.641883" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:51.642585" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:51.642343" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:51.647437" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:51.644875" elapsed="0.004294">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:51.642710" elapsed="0.006545">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:51.649447" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:51.649291" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:51.642691" elapsed="0.006844">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:51.649954" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:51.650086" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:51.650049" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:51.650032" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:51.650285" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:51.650352" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:51.637520" elapsed="0.012941">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:51.650531" 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-04-25T23:52:51.634987" elapsed="0.015636">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:51.650808" 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-04-25T23:52:51.612834" elapsed="0.038082">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:52.668277" 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-04-25T23:52:52.666119" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:52.669044" 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-04-25T23:52:52.668717" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:52.668531" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:52.669755" 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-04-25T23:52:52.669414" elapsed="0.000369"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:52.669264" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:52.668385" 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-04-25T23:52:52.670207" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:52.669942" 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-04-25T23:52:52.671030" level="INFO">${uri} = /restconf/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-04-25T23:52:52.670519" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:52.670290" 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-04-25T23:52:52.671278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:52.671119" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:52.669904" elapsed="0.001450"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:52.671396" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:52:52.671568" level="INFO">${uri} = /restconf/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-04-25T23:52:52.665619" elapsed="0.005975"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:52.671641" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:52:52.671831" level="INFO">${uri} = /restconf/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-04-25T23:52:52.664897" elapsed="0.006960"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:52.679609" level="INFO">/restconf/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-04-25T23:52:52.679344" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:52.680073" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:52.679826" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:52.684925" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:52.682302" elapsed="0.004413">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:52.680186" elapsed="0.006617">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:52.686988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:52.686837" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:52.680167" elapsed="0.006908">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:52.687451" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:52.687597" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:52.687559" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:52.687538" 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-04-25T23:52:52.687822" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:52.687891" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:52.674846" elapsed="0.013186">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:52.688106" 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-04-25T23:52:52.672107" elapsed="0.016094">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:52.688372" 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-04-25T23:52:52.651890" elapsed="0.036592">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:53.708390" 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-04-25T23:52:53.706113" elapsed="0.002319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:53.709179" 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-04-25T23:52:53.708844" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:53.708685" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:53.709828" 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-04-25T23:52:53.709484" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:53.709326" elapsed="0.000566"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:53.708513" 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-04-25T23:52:53.710262" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:53.709995" 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-04-25T23:52:53.711113" level="INFO">${uri} = /restconf/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-04-25T23:52:53.710596" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:53.710345" elapsed="0.000832"/>
</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-04-25T23:52:53.711363" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:53.711201" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:53.709973" elapsed="0.001466"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:53.711486" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:52:53.711658" level="INFO">${uri} = /restconf/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-04-25T23:52:53.705613" elapsed="0.006086"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:53.711747" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:53.711892" level="INFO">${uri} = /restconf/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-04-25T23:52:53.704959" elapsed="0.006959"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:53.719590" level="INFO">/restconf/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-04-25T23:52:53.719303" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:53.720084" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:53.719829" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:53.725128" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:53.722321" elapsed="0.004649">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:53.720196" elapsed="0.006878">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:53.727268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:53.727111" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:53.720178" elapsed="0.007180">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:53.727770" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:53.727912" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:53.727875" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:53.727858" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:53.728132" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:53.728211" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:53.714719" elapsed="0.013601">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:53.728396" 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-04-25T23:52:53.712144" elapsed="0.016351">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:53.728700" 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-04-25T23:52:53.689441" elapsed="0.039391">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:54.745250" 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-04-25T23:52:54.743078" elapsed="0.002204"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.745989" 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-04-25T23:52:54.745642" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:52:54.745490" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.746599" 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-04-25T23:52:54.746280" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:54.746132" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:52:54.745350" 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-04-25T23:52:54.747039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.746780" 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-04-25T23:52:54.747912" level="INFO">${uri} = /restconf/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-04-25T23:52:54.747348" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:54.747120" elapsed="0.000857"/>
</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-04-25T23:52:54.748166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.748002" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.746759" elapsed="0.001484"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:54.748279" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:52:54.748435" level="INFO">${uri} = /restconf/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-04-25T23:52:54.742585" elapsed="0.005877"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:54.748510" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:54.748656" level="INFO">${uri} = /restconf/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-04-25T23:52:54.742005" elapsed="0.006691"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.756004" level="INFO">/restconf/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-04-25T23:52:54.755744" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.756441" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.756200" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:54.761409" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.758683" elapsed="0.004560">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:54.756551" elapsed="0.006779">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.763516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.763364" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:54.756532" elapsed="0.007070">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.763988" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.764118" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.764082" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.764066" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.764316" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.764383" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.751394" elapsed="0.013094">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.764558" 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-04-25T23:52:54.748946" elapsed="0.015705">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:54.764873" 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-04-25T23:52:54.729704" elapsed="0.035283">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:52:54.765124" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:33.961063" elapsed="20.804158">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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-04-25T23:52:33.960633" elapsed="20.804699">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:52:33.898328" elapsed="20.867166">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t6" name="Check_Device_Data_Is_Empty" line="80">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:54.769007" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:54.768742" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.770392" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.770279" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.770260" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.775648" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.775540" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.775521" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.776783" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:54.776358" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.777406" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:54.777005" elapsed="0.000435"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:54.777495" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:52:54.777700" 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-04-25T23:52:54.775966" elapsed="0.001765"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.783322" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.783198" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.783178" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.784866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.784754" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.784735" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:54.785474" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.785079" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.785987" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.785724" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.787011" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.786573" elapsed="0.001466">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:54.788250" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:54.788307" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.786174" elapsed="0.002161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.789258" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.788966" elapsed="0.001475">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:54.790625" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:54.790689" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.788509" elapsed="0.002206"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.791641" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.791017" elapsed="0.000727">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:54.790793" elapsed="0.001047">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:54.790773" elapsed="0.001102">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.792039" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.792266" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.792126" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.792109" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.792397" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.795559" elapsed="0.000171"/>
</kw>
<msg time="2026-04-25T23:52:54.795807" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:54.794819" elapsed="0.001085"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.796846" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.797941" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.793268" elapsed="0.004793"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:54.792666" elapsed="0.005512"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.784415" elapsed="0.013850">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</status>
</kw>
<msg time="2026-04-25T23:52:54.798371" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:54.798422" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.783587" elapsed="0.014859"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.798638" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.798527" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.798507" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.799530" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.799423" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.799406" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.799900" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:54.800043" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:54.799769" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.800494" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.800222" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.800963" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.800708" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.801529" elapsed="0.000491"/>
</kw>
<msg time="2026-04-25T23:52:54.802122" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:54.802169" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.801168" elapsed="0.001023"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.803036" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.805261" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.804825" elapsed="0.001304">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.803435" elapsed="0.002783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:54.807735" elapsed="0.000366"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.806463" elapsed="0.001705"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:54.802492" elapsed="0.005778"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:54.802270" elapsed="0.006052"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.802250" elapsed="0.006101"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:54.809315" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.808906" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:54.809392" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:54.809548" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.808559" elapsed="0.001014"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.809764" elapsed="0.000537"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.810591" level="INFO">index=23
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:54.810482" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.810893" elapsed="0.002275"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.813588" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:54.814699" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.813328" elapsed="0.001742">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.825550" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:52:54.825944" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:54.824215" elapsed="0.001822"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.826410" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.826683" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.815874" elapsed="0.010952"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:54.815344" elapsed="0.011579"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.799125" elapsed="0.027885">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.827354" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.827429" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.782850" elapsed="0.044685">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:54.827643" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:54.827704" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.778113" elapsed="0.049616"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.828061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.827809" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.827790" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:54.777967" elapsed="0.050194"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:54.777790" elapsed="0.050403"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:54.775165" elapsed="0.053084"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:54.769965" elapsed="0.058341"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.769471" elapsed="0.058880"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:54.766395" elapsed="0.062010"/>
</kw>
<kw name="Regexp Escape" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.828943" level="INFO">${escaped} = urn:ietf:params:xml:ns:netconf:base:1\.0</msg>
<var>${escaped}</var>
<arg>${ODL_NETCONF_NAMESPACE}</arg>
<doc>Returns each argument escaped for use as a regular expression.</doc>
<status status="PASS" start="2026-04-25T23:52:54.828566" elapsed="0.000404"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.830320" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:54.829920" elapsed="0.000427"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.838206" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.837953" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.838694" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.838432" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:54.843388" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.840916" elapsed="0.004110">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:54.838835" elapsed="0.006273">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.845304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.845143" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:54.838788" elapsed="0.006635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.845916" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.846053" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.846015" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.845997" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.846259" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.846328" 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-04-25T23:52:54.833434" elapsed="0.013005">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.846534" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.830557" elapsed="0.016074">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.846703" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.829613" elapsed="0.017185">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.847019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.846872" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.847238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.847097" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.847450" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.847314" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.846854" elapsed="0.000669"/>
</if>
<arg>&lt;data xmlns\="${escaped}"(\/&gt;|&gt;&lt;\/data&gt;)</arg>
<arg>${True}</arg>
<status status="FAIL" start="2026-04-25T23:52:54.829182" elapsed="0.018420">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.765879" elapsed="0.081897">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t7" name="Create_Device_Data_Label_Via_Xml" line="85">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:54.851214" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:54.850954" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.852505" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.852390" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.852372" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.857771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.857648" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.857630" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.858904" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:54.858474" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.859425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:54.859127" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:54.859496" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:54.859658" 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-04-25T23:52:54.858099" 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-04-25T23:52:54.865170" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.865063" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.865044" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.866445" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.866338" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.866319" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:54.867073" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.866657" elapsed="0.000442"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.867508" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.867259" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.868378" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.868098" elapsed="0.001174">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:54.869452" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:54.869497" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.867709" elapsed="0.001811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.870366" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.870090" elapsed="0.001302">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:54.871570" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:54.871616" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.869701" elapsed="0.001938"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.872725" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.871962" elapsed="0.000846">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:54.871741" elapsed="0.001160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:54.871722" elapsed="0.001214">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.873094" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.873322" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.873182" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.873164" elapsed="0.000258"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.873455" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.876506" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:52:54.876743" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:54.875866" elapsed="0.000972"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.877755" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.878709" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.874321" elapsed="0.004502"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:54.873739" elapsed="0.005236"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.866035" elapsed="0.013101">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</status>
</kw>
<msg time="2026-04-25T23:52:54.879240" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:54.879284" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Device_Data_Label_Via_Xml"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.865383" elapsed="0.013926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.879502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.879393" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.879373" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.880464" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:54.880359" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.880341" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.880834" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:54.880938" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:54.880710" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.881371" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.881113" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.881824" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.881563" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.882374" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:52:54.882808" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:54.882854" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.882021" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.883795" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.885879" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.885445" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.884190" elapsed="0.002305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:54.888204" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.886751" elapsed="0.001874"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:54.883193" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:54.882952" elapsed="0.005844"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.882933" elapsed="0.005888"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:54.889846" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.889423" elapsed="0.000450"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:54.889925" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:54.890076" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.889098" elapsed="0.001001"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.890250" elapsed="0.000441"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.891127" level="INFO">index=24
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:54.890865" 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-04-25T23:52:54.891466" elapsed="0.002284"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:54.894175" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:54.895103" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.893913" elapsed="0.001603">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:54.907106" elapsed="0.000313"/>
</kw>
<msg time="2026-04-25T23:52:54.907476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:54.905776" 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-04-25T23:52:54.907942" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.908198" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:54.896458" elapsed="0.011881"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:54.895948" elapsed="0.012443"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.880066" elapsed="0.028405">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.908817" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.908890" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.864726" elapsed="0.044266">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:54.909094" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:54.909137" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.860077" elapsed="0.049083"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.909481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.909235" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.909217" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:54.859937" elapsed="0.049642"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:54.859754" elapsed="0.049856"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:54.857281" elapsed="0.052399"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:54.852102" elapsed="0.057636"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:54.851649" elapsed="0.058133"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:54.848713" elapsed="0.061122"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.910431" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:52:54.910000" elapsed="0.000457"/>
</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-04-25T23:52:54.944969" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:54.944575" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:54.945759" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:54.945490" elapsed="0.000372">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:54.945958" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:54.945156" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.946529" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:54.946144" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:54.946872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:54.947029" 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-04-25T23:52:54.946733" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.947450" 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-04-25T23:52:54.947208" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.948486" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:54.948199" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.948966" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.948703" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.949769" 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-04-25T23:52:54.949346" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:54.950554" 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-04-25T23:52:54.950306" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:54.950629" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:52:54.950809" 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-04-25T23:52:54.949979" elapsed="0.000854"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.950984" elapsed="0.000227"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:54.949213" elapsed="0.002038"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.951823" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:54.951494" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:54.952588" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.952354" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:54.952665" elapsed="0.000043"/>
</return>
<msg time="2026-04-25T23:52:54.952831" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:54.952029" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:54.953007" elapsed="0.000220"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:52:54.951364" elapsed="0.001903"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:52:54.949040" elapsed="0.004266"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:52:54.953348" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:54.953503" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:52:54.947874" elapsed="0.005658"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:54.947561" elapsed="0.006004"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.953754" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.953590" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:54.947542" elapsed="0.006289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:54.954731" level="INFO">${final_text} = /restconf/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-04-25T23:52:54.953972" elapsed="0.000787"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:54.954808" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:54.943945" elapsed="0.011022"/>
</kw>
<msg time="2026-04-25T23:52:54.955022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:54.931106" elapsed="0.023962"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.967425" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.979843" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.992315" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.992508" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.992693" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.993073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:54.992917" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:54.992902" elapsed="0.000250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.993287" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.993455" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.993616" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:54.992875" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.992772" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:54.993852" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:54.993926" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:54.994042" level="INFO">${uri} = /restconf/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-04-25T23:52:54.926711" elapsed="0.067357"/>
</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-04-25T23:52:55.018932" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.018533" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.019735" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:55.019508" elapsed="0.000291">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.019893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.019168" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.020464" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.020076" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.020800" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:55.020928" 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-04-25T23:52:55.020648" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.021355" 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-04-25T23:52:55.021111" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:52:55.021795" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.021468" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.022313" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.022020" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.021878" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.021450" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.022993" 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-04-25T23:52:55.022543" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:55.023069" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:55.017898" elapsed="0.005294"/>
</kw>
<msg time="2026-04-25T23:52:55.023244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.005011" elapsed="0.018279"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.035877" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.048709" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.064253" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.064595" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.064839" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.065317" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.065141" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.065121" elapsed="0.000300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.065593" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.065803" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.065997" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.065082" elapsed="0.000986"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.064944" elapsed="0.001155"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.066267" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.066381" elapsed="0.000023"/>
</return>
<msg time="2026-04-25T23:52:55.066551" 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-04-25T23:52:55.004158" elapsed="0.062425"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.068106" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:55.067806" elapsed="0.000374">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.068275" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.067379" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.068644" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.068384" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.069224" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.068921" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.068742" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.068366" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.071863" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.069484" elapsed="0.002407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:52:55.071943" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.072097" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.066995" elapsed="0.005127"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.073854" level="INFO">/restconf/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-04-25T23:52:55.073581" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.074284" 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-04-25T23:52:55.074050" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.074812" 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-04-25T23:52:55.074539" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.075245" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.075006" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.076109" 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-04-25T23:52:55.075910" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:52:55.076465" 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-04-25T23:52:55.076284" elapsed="0.000207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.076638" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.077260" 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-04-25T23:52:55.077016" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:52:55.077345" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.077498" 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-04-25T23:52:55.075492" elapsed="0.002030"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:55.084089" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.081555" elapsed="0.004264">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.077591" elapsed="0.008317">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.086093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.085942" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.077574" elapsed="0.008609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.086555" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.086738" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.086654" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.086634" 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-04-25T23:52:55.086943" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.087010" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.072465" elapsed="0.014648">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.087194" 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-04-25T23:52:54.915385" elapsed="0.171902">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.087618" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.087440" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.087422" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.087759" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</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-04-25T23:52:54.910979" elapsed="0.176875">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:52:54.848113" elapsed="0.239896">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t8" name="Check_Device_Data_Label_Is_Created" line="90">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:55.091441" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:55.091180" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.092701" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.092576" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.092557" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.097944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.097839" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.097820" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.099011" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.098599" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.099490" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:55.099196" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:55.099559" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.099731" 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-04-25T23:52:55.098230" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.105307" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.105200" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.105182" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.106587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.106481" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.106463" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.107197" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.106821" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.107632" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.107379" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.108494" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.108222" elapsed="0.001252">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.109660" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:55.109723" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.107835" elapsed="0.001949"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.110623" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.110348" elapsed="0.001427">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.111954" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:55.112001" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.109954" elapsed="0.002071"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.112951" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.112320" elapsed="0.000711">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.112101" elapsed="0.001025">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.112082" elapsed="0.001223">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.113468" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.113712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.113556" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.113538" elapsed="0.000273"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.113844" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.116972" elapsed="0.000145"/>
</kw>
<msg time="2026-04-25T23:52:55.117189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.116221" elapsed="0.001064"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.118222" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.119173" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.114698" elapsed="0.004620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.114101" elapsed="0.005337"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.106174" elapsed="0.013348">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:52:55.119625" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.119773" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.105522" elapsed="0.014278"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.119986" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.119879" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.119859" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.120849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.120744" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.120726" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.121184" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.121286" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.121065" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.121735" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.121462" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.122223" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.121929" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.122834" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:52:55.123256" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:55.123303" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.122422" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.124225" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.126413" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.125986" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.124658" elapsed="0.002381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.128726" elapsed="0.000361"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.127276" elapsed="0.001874"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:55.123637" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.123415" elapsed="0.005889"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.123397" elapsed="0.005933"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.130279" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.129870" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:55.130354" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.130505" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.129531" elapsed="0.000998"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.130698" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.131382" level="INFO">index=25
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.131273" 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-04-25T23:52:55.131664" elapsed="0.002446"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.134534" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:55.135309" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.134273" elapsed="0.001566">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.146436" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:52:55.146827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.145080" elapsed="0.001833"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.147242" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.147507" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.136618" elapsed="0.011030"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.136112" elapsed="0.011805"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.120434" elapsed="0.027567">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.148340" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.148449" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.104864" elapsed="0.043691">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:55.148663" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.148720" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.100117" elapsed="0.048627"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.149071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.148821" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.148802" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:55.099980" elapsed="0.049191"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:55.099809" elapsed="0.049392"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:55.097458" elapsed="0.051796"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:55.092290" elapsed="0.057019"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.091869" elapsed="0.057484"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:55.088935" elapsed="0.060470"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.150654" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.150264" 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-04-25T23:52:55.158443" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.158188" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.158902" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.158641" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:55.163462" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.161114" elapsed="0.004009">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.159014" elapsed="0.006190">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.165387" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.165238" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.158995" elapsed="0.006480">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.165864" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.165996" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.165959" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.165942" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.166195" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.166299" 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-04-25T23:52:55.153475" elapsed="0.012931">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.166476" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.150904" elapsed="0.015667">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.166626" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.150005" elapsed="0.016731">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.166957" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.166812" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.167176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.167036" elapsed="0.000195"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.167390" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.167253" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.166795" elapsed="0.000674"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:52:55.149606" elapsed="0.017942">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.088389" elapsed="0.079317">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t9" name="Modify_Device_Data_Label_Via_Xml" line="95">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:55.170935" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:55.170660" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.172167" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.172059" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.172041" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.177485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.177378" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.177359" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.178546" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.178165" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.179042" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:55.178746" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:55.179112" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.179266" 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-04-25T23:52:55.177794" elapsed="0.001497"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.184858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.184714" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.184693" 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-04-25T23:52:55.186159" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.186051" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.186033" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.186778" 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-04-25T23:52:55.186393" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.187199" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.186960" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.188047" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.187786" elapsed="0.001155">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.189118" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:55.189163" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.187382" elapsed="0.001804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.190085" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.189814" elapsed="0.001320">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.191309" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:55.191354" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.189358" elapsed="0.002023"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.192280" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.191689" elapsed="0.000815">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.191457" elapsed="0.001170">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.191438" elapsed="0.001225">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.192846" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.193073" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.192934" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.192917" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.193202" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.196106" elapsed="0.000144"/>
</kw>
<msg time="2026-04-25T23:52:55.196319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.195498" elapsed="0.000916"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.197410" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.198403" 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-04-25T23:52:55.194058" elapsed="0.004466"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.193463" elapsed="0.005182"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.185745" elapsed="0.013039">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</status>
</kw>
<msg time="2026-04-25T23:52:55.198888" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.198932" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Xml"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.185079" elapsed="0.013877"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.199178" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.199069" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.199049" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.200164" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.200057" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.200038" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.200496" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.200599" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.200376" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.201083" 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-04-25T23:52:55.200823" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.201523" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.201278" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.202092" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:52:55.202507" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:55.202553" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.201737" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.203491" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.205612" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.205187" elapsed="0.000978">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.203906" elapsed="0.002336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.207862" elapsed="0.000353"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.206482" elapsed="0.001797"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:55.202997" elapsed="0.005384"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.202655" elapsed="0.005777"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.202634" elapsed="0.005824"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.209482" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.209071" elapsed="0.000439"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:55.209559" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.209730" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.208662" elapsed="0.001093"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.209907" elapsed="0.000398"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.210588" level="INFO">index=26
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.210477" elapsed="0.000266"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.210888" elapsed="0.002433"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.213760" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:55.214830" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.213486" elapsed="0.001712">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.225704" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:52:55.226082" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.224161" elapsed="0.002010"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.226536" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.227056" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.215982" elapsed="0.011219"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.215464" elapsed="0.011786"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.199635" elapsed="0.027697">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.227665" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.227754" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.184324" elapsed="0.043534">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:55.227963" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.228006" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.179655" elapsed="0.048374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.228353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.228105" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.228087" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:55.179513" elapsed="0.048939"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:55.179344" elapsed="0.049138"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:55.177013" elapsed="0.051523"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:55.171774" elapsed="0.056816"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.171343" elapsed="0.057292"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:55.168519" elapsed="0.060185"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.229334" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:52:55.228871" elapsed="0.000492"/>
</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-04-25T23:52:55.263500" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.263125" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.264287" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:55.264037" elapsed="0.000312">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.264440" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.263705" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.265024" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.264623" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.265381" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:55.265533" 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-04-25T23:52:55.265245" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.266273" 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-04-25T23:52:55.265727" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.267317" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.267045" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.267796" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.267517" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.268473" 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-04-25T23:52:55.268175" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.269300" 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-04-25T23:52:55.269051" elapsed="0.000275"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.269376" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.269526" 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-04-25T23:52:55.268735" elapsed="0.000814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.269719" elapsed="0.000250"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:55.268043" elapsed="0.001967"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.270581" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:55.270252" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.271357" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.271119" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.271443" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:52:55.271618" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:55.270807" elapsed="0.000835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.271808" elapsed="0.000224"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:52:55.270123" elapsed="0.001949"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:52:55.267870" elapsed="0.004236"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:52:55.272147" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:55.272302" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:52:55.266712" elapsed="0.005615"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.266401" elapsed="0.005958"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.272529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.272383" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.266381" elapsed="0.006222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.273325" level="INFO">${final_text} = /restconf/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-04-25T23:52:55.272760" elapsed="0.000592"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:55.273400" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:55.262497" elapsed="0.011024"/>
</kw>
<msg time="2026-04-25T23:52:55.273574" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.249426" elapsed="0.024195"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.286330" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.298849" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.311298" 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-04-25T23:52:55.311495" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.311683" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.312046" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.311903" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.311889" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.312262" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.312424" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.312586" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.311862" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.311761" elapsed="0.000906"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.312824" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.312906" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:55.313023" level="INFO">${uri} = /restconf/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-04-25T23:52:55.245144" elapsed="0.067904"/>
</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-04-25T23:52:55.339419" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.339029" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.340189" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:55.339984" elapsed="0.000267">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.340342" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.339604" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.340977" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.340573" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.341295" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:55.341421" 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-04-25T23:52:55.341162" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.341869" 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-04-25T23:52:55.341605" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:52:55.342268" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.341981" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.342799" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.342490" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.342349" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.341962" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.343487" 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-04-25T23:52:55.343023" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:55.343564" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:55.338410" elapsed="0.005294"/>
</kw>
<msg time="2026-04-25T23:52:55.343758" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.325748" elapsed="0.018056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.356409" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.368939" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.381220" 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-04-25T23:52:55.381409" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.381578" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.381995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.381851" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.381835" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.382213" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.382380" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.382546" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.381807" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.381700" 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-04-25T23:52:55.382785" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.382861" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:55.382980" 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-04-25T23:52:55.323109" elapsed="0.059898"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.384294" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:52:55.384044" elapsed="0.000315">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.384452" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.383665" 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-04-25T23:52:55.384812" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.384547" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.385355" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.385062" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.384893" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.384529" elapsed="0.000909"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.387830" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.385586" elapsed="0.002271"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:52:55.387908" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.388082" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:52:55.383338" elapsed="0.004769"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.389492" level="INFO">/restconf/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-04-25T23:52:55.389241" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.389994" 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-04-25T23:52:55.389705" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.390430" 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-04-25T23:52:55.390189" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.390878" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.390619" elapsed="0.000303"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.391735" 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-04-25T23:52:55.391518" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:52:55.392324" 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-04-25T23:52:55.391911" elapsed="0.000452"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.392537" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.393184" 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-04-25T23:52:55.392932" elapsed="0.000296"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:52:55.393271" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.393431" 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-04-25T23:52:55.391123" elapsed="0.002333"/>
</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-04-25T23:52:55.398466" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.395850" elapsed="0.004315">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.393533" elapsed="0.006750">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.400469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.400319" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.393509" elapsed="0.007049">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.400946" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.401075" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.401038" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.401021" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.401286" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.401352" 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-04-25T23:52:55.388433" elapsed="0.013022">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.401529" 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-04-25T23:52:55.234127" elapsed="0.167494">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.401921" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.401747" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.401730" elapsed="0.000279"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.402041" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</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-04-25T23:52:55.229620" elapsed="0.172560">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to change the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.167904" elapsed="0.234439">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t10" name="Check_Device_Data_Label_Is_Modified" line="100">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:55.406327" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:55.406068" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.407577" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.407468" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.407450" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.414579" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.414472" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.414454" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.415658" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.415265" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.416150" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:55.415856" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:55.416219" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.416372" 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-04-25T23:52:55.414893" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.421857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.421751" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.421733" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.423133" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.423027" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.423010" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.423709" 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-04-25T23:52:55.423337" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.424136" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.423891" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.425005" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.424733" elapsed="0.001156">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.426066" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:55.426111" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.424315" elapsed="0.001820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.426974" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.426702" elapsed="0.001306">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.428184" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:55.428229" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.426297" elapsed="0.001955"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.429188" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.428540" elapsed="0.000770">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.428326" elapsed="0.001080">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.428307" elapsed="0.001269">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.429756" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.429980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.429843" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.429827" elapsed="0.000247"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.430106" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.433237" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:52:55.433461" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.432447" elapsed="0.001110"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.434606" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.435565" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.430962" elapsed="0.004825"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.430365" elapsed="0.005540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.422727" elapsed="0.013263">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</status>
</kw>
<msg time="2026-04-25T23:52:55.436090" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.436134" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.422070" elapsed="0.014087"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.436339" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.436232" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.436214" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.437208" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.437105" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.437087" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.437537" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.437637" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.437418" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.438084" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.437828" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.438513" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.438274" 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-04-25T23:52:55.439079" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:52:55.439493" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:55.439539" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.438726" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.440514" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.442623" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.442208" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.440925" elapsed="0.002351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.444934" elapsed="0.000370"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.443515" elapsed="0.001851"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:55.440010" elapsed="0.005457"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.439635" elapsed="0.005882"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.439617" elapsed="0.005926"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.446492" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.446083" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:55.446567" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.446738" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.445762" elapsed="0.001001"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.446917" elapsed="0.000410"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.447599" level="INFO">index=27
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.447494" elapsed="0.000267"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.447907" elapsed="0.002409"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.450759" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:55.451644" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.450483" elapsed="0.001573">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.462409" elapsed="0.000534"/>
</kw>
<msg time="2026-04-25T23:52:55.463001" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.460976" elapsed="0.002113"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.463418" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.463692" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.452946" elapsed="0.010888"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.452325" elapsed="0.011557"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.436801" elapsed="0.027162">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.464293" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.464365" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.421402" elapsed="0.043065">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:55.464570" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.464612" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.416808" elapsed="0.047827"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.464977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.464729" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.464711" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:55.416653" elapsed="0.048459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:55.416452" elapsed="0.048690"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:55.414105" elapsed="0.051092"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:55.407180" elapsed="0.058072"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.406757" elapsed="0.058539"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:55.403568" elapsed="0.061780"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.466616" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.466229" 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-04-25T23:52:55.474345" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.474093" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.474804" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.474541" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:55.479435" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.476969" elapsed="0.004071">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.474915" elapsed="0.006206">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.481305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.481155" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.474896" elapsed="0.006496">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.481808" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.481941" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.481904" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.481887" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.482141" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.482209" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.469473" elapsed="0.012838">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.482381" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.467104" elapsed="0.015371">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.482563" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.465972" elapsed="0.016690">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.482929" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.482752" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.483158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.483013" elapsed="0.000198"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.483371" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.483235" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.482735" elapsed="0.000709"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:52:55.465575" elapsed="0.017949">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.402906" elapsed="0.080774">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t11" name="Deconfigure_Device_From_Netconf_Temporarily" line="105">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:55.487201" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:55.486943" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.488444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.488336" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.488318" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.493696" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.493571" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.493553" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.494779" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.494377" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.495259" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:55.494964" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:55.495328" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.495481" 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-04-25T23:52:55.494003" elapsed="0.001503"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.500933" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.500826" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.500807" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.502208" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.502102" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.502084" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.502794" 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-04-25T23:52:55.502422" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.503216" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.502976" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.504109" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.503847" elapsed="0.001121">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.505144" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:55.505190" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.503442" elapsed="0.001772"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.506051" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.505780" elapsed="0.001305">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.507259" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:55.507305" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.505379" elapsed="0.001948"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.508229" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.507622" elapsed="0.000685">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.507406" elapsed="0.000992">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.507385" elapsed="0.001193">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.508757" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.508984" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.508846" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.508828" elapsed="0.000251"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.509112" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.512023" elapsed="0.000143"/>
</kw>
<msg time="2026-04-25T23:52:55.512236" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.511416" elapsed="0.000913"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.513246" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.514238" 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-04-25T23:52:55.509960" elapsed="0.004424"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.509366" elapsed="0.005132"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.501788" elapsed="0.012794">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</status>
</kw>
<msg time="2026-04-25T23:52:55.514808" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.514855" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf_Temporarily"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.501148" elapsed="0.013730"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.515061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.514955" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.514936" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.515921" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.515816" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.515798" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.516247" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.516348" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.516133" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.516839" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.516560" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.517276" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.517034" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.517848" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:52:55.518263" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:55.518310" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.517475" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.519252" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.521325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.520911" elapsed="0.000963">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.519647" elapsed="0.002304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.523935" elapsed="0.000368"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.522185" elapsed="0.002181"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:55.518642" elapsed="0.005824"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.518423" elapsed="0.006093"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.518405" elapsed="0.006142"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.525504" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.525100" elapsed="0.000431"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:55.525579" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.525749" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.524767" elapsed="0.001006"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.525927" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.526624" level="INFO">index=28
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.526517" elapsed="0.000264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.526927" elapsed="0.002412"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.529778" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:55.530815" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.529500" elapsed="0.001692">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.541643" elapsed="0.000338"/>
</kw>
<msg time="2026-04-25T23:52:55.542038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.540222" elapsed="0.001934"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.542487" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.543009" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.531984" elapsed="0.011177"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.531462" elapsed="0.011747"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.515506" elapsed="0.027837">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.543693" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.543767" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.500474" elapsed="0.043396">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:55.543975" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.544017" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.495886" elapsed="0.048154"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.544363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.544114" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.544097" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:55.495747" elapsed="0.048715"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:55.495558" elapsed="0.048933"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:55.493205" elapsed="0.051340"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:55.488050" elapsed="0.056550"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.487613" elapsed="0.057031"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:55.484793" elapsed="0.059921"/>
</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-04-25T23:52:55.564219" elapsed="0.000418"/>
</kw>
<msg time="2026-04-25T23:52:55.564706" 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-04-25T23:52:55.563865" elapsed="0.000891"/>
</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-04-25T23:52:55.563464" elapsed="0.001367"/>
</kw>
<msg time="2026-04-25T23:52:55.564874" 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-04-25T23:52:55.554815" elapsed="0.010100"/>
</kw>
<msg time="2026-04-25T23:52:55.565016" 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-04-25T23:52:55.554475" elapsed="0.010564"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.565942" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:52:55.565201" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:52:55.598603" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:52:55.598219" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.599393" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:52:55.599144" elapsed="0.000313">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.599588" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.598812" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.600191" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.599804" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.600516" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:55.601250" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:52:55.600377" elapsed="0.000900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.601703" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.601440" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.602717" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.602439" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.603188" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.602923" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.604138" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:55.603582" elapsed="0.000583"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.605292" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.604812" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.605448" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.605690" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:55.604352" elapsed="0.001365"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.605869" elapsed="0.000473"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:52:55.603451" elapsed="0.002933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.607147" 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-04-25T23:52:55.606630" elapsed="0.000544"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.608445" 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-04-25T23:52:55.607969" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.608599" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.608848" 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-04-25T23:52:55.607356" elapsed="0.001517"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.609024" elapsed="0.000471"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:52:55.606498" elapsed="0.003039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.610297" 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-04-25T23:52:55.609799" elapsed="0.000524"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.611435" 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-04-25T23:52:55.610962" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.611585" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.611829" 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-04-25T23:52:55.610509" elapsed="0.001346"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.612028" elapsed="0.000472"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:52:55.609649" elapsed="0.002893"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.613393" 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-04-25T23:52:55.612858" elapsed="0.000562"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.614522" 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-04-25T23:52:55.614056" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.614693" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.614917" 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-04-25T23:52:55.613604" elapsed="0.001338"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.615094" elapsed="0.000470"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:52:55.612654" elapsed="0.002952"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.616382" 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-04-25T23:52:55.615866" elapsed="0.000543"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.617604" 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-04-25T23:52:55.617132" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.617782" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.618005" 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-04-25T23:52:55.616592" elapsed="0.001438"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.618179" elapsed="0.000468"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:52:55.615735" elapsed="0.002972"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.619444" 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-04-25T23:52:55.618951" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.620601" 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-04-25T23:52:55.620104" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.620840" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.621065" 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-04-25T23:52:55.619655" elapsed="0.001435"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.621239" elapsed="0.000486"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:52:55.618820" elapsed="0.002947"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.622506" 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-04-25T23:52:55.622009" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.623637" 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-04-25T23:52:55.623166" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.623808" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:52:55.624032" 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-04-25T23:52:55.622730" 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-04-25T23:52:55.624220" elapsed="0.000568"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:52:55.621879" elapsed="0.002952"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.625767" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:52:55.625073" elapsed="0.000720"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:52:55.626903" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.626415" elapsed="0.000527"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:52:55.627053" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:52:55.627277" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:52:55.625979" elapsed="0.001322"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.627451" elapsed="0.000545"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:52:55.624942" elapsed="0.003098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:52:55.603264" elapsed="0.024810"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:52:55.628151" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.628342" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:52:55.602116" elapsed="0.026252"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.601819" elapsed="0.026582"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.628575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.628426" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.601799" elapsed="0.026853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.629686" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:52:55.628993" elapsed="0.000722"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:55.629763" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:55.597590" elapsed="0.032299"/>
</kw>
<msg time="2026-04-25T23:52:55.629942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.584924" elapsed="0.045064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.642451" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.654994" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.667374" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.667579" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.667774" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.668142" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.667998" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.667983" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.668357" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.668523" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.668704" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.667956" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.667853" elapsed="0.000932"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.668992" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.669070" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:52:55.669183" level="INFO">${uri} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:52:55.580612" elapsed="0.088597"/>
</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-04-25T23:52:55.693908" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:52:55.693517" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.694635" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:52:55.694420" elapsed="0.000300">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.694813" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.694094" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.695378" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/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-04-25T23:52:55.694998" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.695715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:52:55.695851" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:52:55.695561" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.696268" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.696028" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:52:55.696680" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.696380" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.697410" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.696904" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.696763" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.696361" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.698324" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:52:55.697641" elapsed="0.000712"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:52:55.698402" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:52:55.692897" elapsed="0.005633"/>
</kw>
<msg time="2026-04-25T23:52:55.698582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.680268" elapsed="0.018362"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.711051" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.723474" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.735855" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.736047" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.736218" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.736578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.736437" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.736422" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.736812" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.736976" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.737139" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.736394" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.736291" 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-04-25T23:52:55.737357" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.737430" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:52:55.737545" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:52:55.679404" elapsed="0.058168"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:52:55.738855" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.738594" elapsed="0.000325">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:52:55.739011" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:52:55.738260" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.739347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.739105" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.739942" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:52:55.739630" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.739462" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.739087" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.742405" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.740174" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:52:55.742484" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.742638" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:52:55.737917" elapsed="0.004760"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.744182" level="INFO">/restconf/operations/netconf-node-topology:delete-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.743937" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.744609" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.744375" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.745059" 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-04-25T23:52:55.744820" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.745518" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.745248" elapsed="0.000323"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.746412" 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-04-25T23:52:55.746207" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:52:55.746779" 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-04-25T23:52:55.746588" elapsed="0.000217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.746951" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.747728" 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-04-25T23:52:55.747297" elapsed="0.000476"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:52:55.747815" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.747972" 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-04-25T23:52:55.745788" elapsed="0.002209"/>
</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">
<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="NOT RUN" start="2026-04-25T23:52:55.750341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.748068" elapsed="0.002340"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:55.753313" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:52:55.750573" elapsed="0.004423">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.750433" elapsed="0.004651">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.748050" elapsed="0.007065">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.755479" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.755614" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.755577" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.755560" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.755838" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.755943" 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-04-25T23:52:55.743000" elapsed="0.013049">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.756130" 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-04-25T23:52:55.569359" elapsed="0.186867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:52:55.756523" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.756342" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.756325" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.756643" elapsed="0.000018"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.566370" elapsed="0.190388">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.566058" elapsed="0.190767">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.757097" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.756861" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.566040" elapsed="0.191144">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:52:55.757333" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type_rpc_delete}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.544983" elapsed="0.212463">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to deconfigure the testtool device on Netconf connector.
This is the first part of the "configure/deconfigure" cycle of the device
The purpose of cycling the device like this is to see that the configuration
data was really stored in the device.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:52:55.483933" elapsed="0.273668">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t12" name="Wait_For_Device_To_Be_Gone" line="118">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:52:55.761464" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:52:55.761205" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.762760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.762626" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.762607" elapsed="0.000252"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.769387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.769281" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.769263" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.770442" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:52:55.770064" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.770966" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:52:55.770653" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:52:55.771036" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:52:55.771189" 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-04-25T23:52:55.769691" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.776885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.776777" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.776758" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.778180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.778074" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.778056" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.778789" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.778386" elapsed="0.000429"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.779218" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.778970" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.780206" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.779926" elapsed="0.001190">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.781305" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:52:55.781350" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.779404" elapsed="0.001970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.782229" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.781955" elapsed="0.001310">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:52:55.783444" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:52:55.783489" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.781540" elapsed="0.001973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.784424" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.783824" elapsed="0.000678">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.783588" elapsed="0.001006">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.783569" elapsed="0.041394">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.825211" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.825478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.825326" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.825305" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.825660" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.829131" elapsed="0.000163"/>
</kw>
<msg time="2026-04-25T23:52:55.829436" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.828259" elapsed="0.001283"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.830524" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.831511" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.826710" elapsed="0.004917"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.825991" elapsed="0.005779"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.777773" elapsed="0.054086">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</status>
</kw>
<msg time="2026-04-25T23:52:55.831970" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.832014" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Be_Gone"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.777100" elapsed="0.054938"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.832224" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.832114" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.832096" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.833154" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.833051" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.833033" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.833487" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.833589" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:52:55.833367" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.834046" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.833782" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.834480" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.834239" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.835054" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:52:55.835475" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:52:55.835559" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.834695" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.836577" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.838704" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.838255" elapsed="0.001042">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.836994" elapsed="0.002381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.840929" elapsed="0.000362"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.839623" elapsed="0.001731"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:52:55.836063" elapsed="0.005392"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.835661" elapsed="0.005847"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.835642" elapsed="0.005891"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:52:55.842629" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.842072" elapsed="0.000587"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:52:55.842723" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:52:55.842877" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.841753" elapsed="0.001149"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.843054" elapsed="0.000456"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.843848" level="INFO">index=29
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:52:55.843739" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:52:55.844121" elapsed="0.002257"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:52:55.846820" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:52:55.847954" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.846540" elapsed="0.001787">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:52:55.858731" elapsed="0.000328"/>
</kw>
<msg time="2026-04-25T23:52:55.859116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:52:55.857403" elapsed="0.001802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.859531" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.859999" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:52:55.849129" elapsed="0.011015"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:52:55.848601" elapsed="0.011592"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.832754" elapsed="0.027521">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.860605" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.860694" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.776421" elapsed="0.084378">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:52:55.860904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:52:55.860952" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.771572" elapsed="0.089403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.861296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.861050" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.861032" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:52:55.771433" elapsed="0.089961"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:52:55.771265" elapsed="0.090160"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:52:55.768916" elapsed="0.092564"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:52:55.762314" elapsed="0.099221"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:52:55.761893" elapsed="0.099685"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:52:55.758741" elapsed="0.102888"/>
</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-04-25T23:52:55.874778" 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-04-25T23:52:55.872684" elapsed="0.002121"/>
</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-04-25T23:52:55.875172" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:55.875016" elapsed="0.000215"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.874893" 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-04-25T23:52:55.875559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.875321" 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-04-25T23:52:55.876396" level="INFO">${uri} = /restconf/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-04-25T23:52:55.875887" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:55.875639" 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-04-25T23:52:55.876650" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.876487" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:55.875303" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:55.876779" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:55.876929" level="INFO">${uri} = /restconf/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-04-25T23:52:55.872210" elapsed="0.004745"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:55.877001" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:52:55.877146" level="INFO">${uri} = /restconf/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-04-25T23:52:55.871716" elapsed="0.005455"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.884429" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.884148" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:55.884899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:55.884631" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:55.889623" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.887164" elapsed="0.004127">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:55.885064" elapsed="0.006309">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.891563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:55.891411" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:55.885044" elapsed="0.006606">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.892040" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.892171" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:55.892134" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:55.892117" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.892372" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.892470" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.879805" elapsed="0.012772">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.892699" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-04-25T23:52:55.877388" elapsed="0.015414">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.892971" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:55.893137" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:55.893200" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:55.864036" elapsed="0.029265">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.893463" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:52:55.863325" elapsed="0.030248">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:52:55.900983" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:55.904557" elapsed="0.000040"/>
</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="FAIL" start="2026-04-25T23:52:55.862825" elapsed="0.041886">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:52:56.923002" 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-04-25T23:52:56.920925" elapsed="0.002105"/>
</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-04-25T23:52:56.923354" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:56.923202" elapsed="0.000208"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:56.923086" 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-04-25T23:52:56.923757" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:56.923498" 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-04-25T23:52:56.924576" level="INFO">${uri} = /restconf/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-04-25T23:52:56.924102" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:56.923838" 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-04-25T23:52:56.924844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:56.924679" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:56.923481" elapsed="0.001438"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:56.924954" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:56.925970" level="INFO">${uri} = /restconf/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-04-25T23:52:56.920456" elapsed="0.005552"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:56.926074" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:52:56.926241" level="INFO">${uri} = /restconf/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-04-25T23:52:56.919977" elapsed="0.006379"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:56.933900" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:56.933616" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:56.934344" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:56.934100" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:56.939000" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:56.936546" elapsed="0.004151">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:56.934455" elapsed="0.006327">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.940966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:56.940815" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:56.934436" elapsed="0.006617">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.941421" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:56.941552" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:56.941515" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:56.941499" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.941770" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:56.941840" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:56.929101" elapsed="0.012845">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:56.942017" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:56.926618" elapsed="0.015495">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.942278" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:56.942441" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:56.942503" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:56.907662" elapsed="0.034938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.942777" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:52:56.906614" elapsed="0.036273">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:52:56.950185" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:56.953749" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:52:56.905393" elapsed="0.048481">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:52:57.971625" 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-04-25T23:52:57.969349" elapsed="0.002330"/>
</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-04-25T23:52:57.972079" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:57.971919" elapsed="0.000219"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:57.971765" elapsed="0.000405"/>
</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-04-25T23:52:57.972526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:57.972249" 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-04-25T23:52:57.973349" level="INFO">${uri} = /restconf/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-04-25T23:52:57.972859" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:57.972608" 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-04-25T23:52:57.973603" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:57.973438" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:57.972227" elapsed="0.001471"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:57.973773" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:52:57.973965" level="INFO">${uri} = /restconf/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-04-25T23:52:57.968839" elapsed="0.005155"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:57.974043" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:52:57.974302" level="INFO">${uri} = /restconf/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-04-25T23:52:57.968285" elapsed="0.006044"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:57.981721" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:57.981442" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:57.982214" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:57.981957" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:57.987278" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:57.984409" elapsed="0.004628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:57.982326" elapsed="0.006801">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:57.989313" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:57.989160" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:57.982308" elapsed="0.007166">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:57.989882" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:57.990055" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:57.990018" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:57.989999" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:57.990260" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:57.990330" 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-04-25T23:52:57.977045" elapsed="0.013404">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:57.990524" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:52:57.974556" elapsed="0.016066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:57.990819" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:57.990984" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:57.991047" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:52:57.957431" elapsed="0.033715">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:57.991312" elapsed="0.000020"/>
</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="FAIL" start="2026-04-25T23:52:57.956276" elapsed="0.035153">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:52:57.998953" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:58.002646" elapsed="0.000047"/>
</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="FAIL" start="2026-04-25T23:52:57.954823" elapsed="0.047975">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:52:59.021453" 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-04-25T23:52:59.019284" elapsed="0.002203"/>
</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-04-25T23:52:59.021896" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:52:59.021714" elapsed="0.000242"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:52:59.021562" elapsed="0.000424"/>
</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-04-25T23:52:59.022329" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:59.022063" elapsed="0.000405"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:52:59.023220" level="INFO">${uri} = /restconf/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-04-25T23:52:59.022741" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-25T23:52:59.022494" 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-04-25T23:52:59.023471" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:59.023308" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:52:59.022041" elapsed="0.001505"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:59.023585" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:52:59.023772" level="INFO">${uri} = /restconf/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-04-25T23:52:59.018796" elapsed="0.005003"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:52:59.023847" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:52:59.023989" level="INFO">${uri} = /restconf/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-04-25T23:52:59.018263" elapsed="0.005751"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:59.031416" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:59.031157" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:52:59.031878" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:52:59.031615" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:52:59.036851" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:52:59.034065" elapsed="0.004508">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:52:59.031990" elapsed="0.006686">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.038864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:52:59.038712" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:52:59.031971" elapsed="0.006981">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.039331" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:59.039461" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:52:59.039425" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:52:59.039408" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.039681" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:52:59.039751" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:52:59.026803" elapsed="0.013055">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:52:59.039929" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:59.024232" elapsed="0.015793">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.040227" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:52:59.040393" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:52:59.040457" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:52:59.006160" elapsed="0.034400">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.040739" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:52:59.005067" elapsed="0.035783">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:52:59.048066" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:52:59.051630" elapsed="0.000028"/>
</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="FAIL" start="2026-04-25T23:52:59.003637" elapsed="0.048131">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:00.069456" 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-04-25T23:53:00.067299" elapsed="0.002186"/>
</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-04-25T23:53:00.069831" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:00.069678" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:00.069543" 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-04-25T23:53:00.070227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:00.069978" 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-04-25T23:53:00.071041" level="INFO">${uri} = /restconf/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-04-25T23:53:00.070540" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:00.070309" 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-04-25T23:53:00.071311" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:00.071140" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:00.069960" elapsed="0.001429"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:00.071422" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:53:00.071574" level="INFO">${uri} = /restconf/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-04-25T23:53:00.066832" elapsed="0.004767"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:00.071646" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:53:00.071811" level="INFO">${uri} = /restconf/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-04-25T23:53:00.066330" elapsed="0.005506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:00.079453" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:00.079177" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:00.079921" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:00.079658" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:00.085101" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:00.082268" elapsed="0.006516">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:00.080094" elapsed="0.008875">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.089382" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:00.089043" elapsed="0.000482"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:00.080072" elapsed="0.009506">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.090432" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:00.090756" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:00.090640" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:00.090603" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.091204" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:00.091354" 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-04-25T23:53:00.074576" elapsed="0.017013">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:00.091777" elapsed="0.000035"/>
</return>
<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="FAIL" start="2026-04-25T23:53:00.072052" elapsed="0.019940">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.092359" elapsed="0.000045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:00.092868" elapsed="0.000052"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:00.093016" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-04-25T23:53:00.054867" elapsed="0.038367">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.093573" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:53:00.053799" elapsed="0.039903">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:00.101115" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:00.104725" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:53:00.052493" elapsed="0.052406">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:01.123515" 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-04-25T23:53:01.121183" elapsed="0.002368"/>
</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-04-25T23:53:01.123987" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:01.123825" elapsed="0.000224"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:01.123649" elapsed="0.000432"/>
</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-04-25T23:53:01.124437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:01.124165" 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-04-25T23:53:01.125263" level="INFO">${uri} = /restconf/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-04-25T23:53:01.124776" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:01.124521" 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-04-25T23:53:01.125519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:01.125353" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:01.124140" elapsed="0.001457"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:01.125636" elapsed="0.000064"/>
</return>
<msg time="2026-04-25T23:53:01.125856" level="INFO">${uri} = /restconf/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-04-25T23:53:01.120682" elapsed="0.005201"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:01.125934" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:01.126079" level="INFO">${uri} = /restconf/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-04-25T23:53:01.120094" elapsed="0.006010"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:01.133629" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:01.133365" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:01.134136" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:01.133857" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:01.139065" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:01.136343" elapsed="0.004473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:01.134250" elapsed="0.006655">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:01.141101" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:01.140940" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:01.134231" elapsed="0.006961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:01.141575" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:01.141787" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:01.141690" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:01.141657" 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-04-25T23:53:01.142039" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:01.142115" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:01.128963" elapsed="0.013264">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:01.142301" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:53:01.126326" elapsed="0.016073">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:01.142574" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:01.142762" elapsed="0.000022"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:01.142828" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:53:01.108790" elapsed="0.034137">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:01.143102" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:53:01.107551" elapsed="0.035665">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:01.150615" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:01.154295" elapsed="0.000039"/>
</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="FAIL" start="2026-04-25T23:53:01.105920" elapsed="0.048534">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:02.173641" 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-04-25T23:53:02.171462" elapsed="0.002229"/>
</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-04-25T23:53:02.174076" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:02.173909" elapsed="0.000225"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:02.173769" elapsed="0.000396"/>
</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-04-25T23:53:02.174507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:02.174242" 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-04-25T23:53:02.175311" level="INFO">${uri} = /restconf/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-04-25T23:53:02.174837" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:02.174590" 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-04-25T23:53:02.175639" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:02.175472" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:02.174219" elapsed="0.001514"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:02.175774" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:53:02.175952" level="INFO">${uri} = /restconf/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-04-25T23:53:02.170986" elapsed="0.004991"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:02.176025" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:02.176166" level="INFO">${uri} = /restconf/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-04-25T23:53:02.170417" elapsed="0.005774"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:02.183453" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:02.183187" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:02.183949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:02.183691" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:02.188924" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:02.186158" elapsed="0.004480">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:02.184061" elapsed="0.006682">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.190927" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:02.190777" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:02.184042" elapsed="0.006973">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.191382" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:02.191514" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:02.191477" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:02.191460" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.191729" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:02.191799" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:02.178854" elapsed="0.013052">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:02.191977" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:02.176411" elapsed="0.015662">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.192238" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:02.192400" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:02.192463" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:53:02.157835" elapsed="0.034725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.192784" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:53:02.156794" elapsed="0.036103">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:02.202226" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:02.205964" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:53:02.155363" elapsed="0.050727">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:03.225105" 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-04-25T23:53:03.222828" elapsed="0.002311"/>
</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-04-25T23:53:03.225527" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:03.225372" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:03.225236" elapsed="0.000381"/>
</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-04-25T23:53:03.225976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:03.225710" 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-04-25T23:53:03.226790" level="INFO">${uri} = /restconf/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-04-25T23:53:03.226287" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:03.226058" 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-04-25T23:53:03.227044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:03.226880" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:03.225687" elapsed="0.001434"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:03.227159" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:53:03.227321" level="INFO">${uri} = /restconf/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-04-25T23:53:03.222330" elapsed="0.005018"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:03.227395" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:03.227539" level="INFO">${uri} = /restconf/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-04-25T23:53:03.221810" elapsed="0.005755"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:03.235042" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:03.234781" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:03.235489" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:03.235243" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:03.240475" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:03.237711" elapsed="0.004469">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:03.235599" elapsed="0.006723">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.242512" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:03.242358" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:03.235580" elapsed="0.007022">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.243001" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:03.243137" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:03.243099" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:03.243081" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.243342" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:03.243418" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:03.230268" elapsed="0.013258">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:03.243598" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:03.227812" elapsed="0.015903">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.243887" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:03.244054" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:03.244122" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:53:03.209601" elapsed="0.034620">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.244384" elapsed="0.000020"/>
</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="FAIL" start="2026-04-25T23:53:03.208443" elapsed="0.036048">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:03.251709" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:03.255287" elapsed="0.000025"/>
</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="FAIL" start="2026-04-25T23:53:03.207007" elapsed="0.048403">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:04.272817" 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-04-25T23:53:04.270620" elapsed="0.002229"/>
</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-04-25T23:53:04.273197" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:04.273043" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:04.272917" elapsed="0.000364"/>
</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-04-25T23:53:04.273611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:04.273350" 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-04-25T23:53:04.274421" level="INFO">${uri} = /restconf/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-04-25T23:53:04.273943" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:04.273710" 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-04-25T23:53:04.274690" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:04.274510" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:04.273330" elapsed="0.001440"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:04.274805" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:04.274963" level="INFO">${uri} = /restconf/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-04-25T23:53:04.270145" elapsed="0.004844"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:04.275037" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:04.275180" level="INFO">${uri} = /restconf/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-04-25T23:53:04.269629" elapsed="0.005576"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:04.282500" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:04.282232" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:04.282968" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:04.282723" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:04.287968" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:04.285210" elapsed="0.004465">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:04.283079" elapsed="0.006681">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.289948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:04.289795" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:04.283060" elapsed="0.006974">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.290407" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:04.290542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:04.290504" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:04.290487" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.290769" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:04.290840" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:04.277873" elapsed="0.013128">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:04.291074" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:04.275425" elapsed="0.015748">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.291344" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:04.291510" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:04.291576" elapsed="0.000048"/>
</return>
<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="FAIL" start="2026-04-25T23:53:04.258750" elapsed="0.033009">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.291933" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:53:04.257699" elapsed="0.034347">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:04.299540" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:04.303229" elapsed="0.000030"/>
</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="FAIL" start="2026-04-25T23:53:04.256309" elapsed="0.047066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:05.321316" 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-04-25T23:53:05.319138" elapsed="0.002210"/>
</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-04-25T23:53:05.321715" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:05.321543" elapsed="0.000232"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:05.321416" elapsed="0.000387"/>
</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-04-25T23:53:05.322137" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:05.321874" 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-04-25T23:53:05.322951" level="INFO">${uri} = /restconf/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-04-25T23:53:05.322449" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:05.322218" 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-04-25T23:53:05.323205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:05.323041" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:05.321853" elapsed="0.001428"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:05.323317" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:53:05.323479" level="INFO">${uri} = /restconf/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-04-25T23:53:05.318645" elapsed="0.004928"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:05.323623" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:05.323788" level="INFO">${uri} = /restconf/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-04-25T23:53:05.318149" elapsed="0.005664"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:05.331273" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:05.331011" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:05.331737" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:05.331475" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:05.336918" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:05.333950" elapsed="0.004657">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:05.331851" elapsed="0.006864">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.338902" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:05.338750" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:05.331832" elapsed="0.007157">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.339365" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:05.339497" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:05.339459" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:05.339442" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.339716" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:05.339793" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:05.326466" elapsed="0.013434">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:05.339972" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:05.324031" elapsed="0.016038">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.340237" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:05.340402" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:05.340464" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:53:05.306695" elapsed="0.033866">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.340743" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:53:05.305614" elapsed="0.035276">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:05.348077" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:05.351723" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:53:05.304252" elapsed="0.047596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:53:06.370132" 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-04-25T23:53:06.367977" elapsed="0.002186"/>
</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-04-25T23:53:06.370508" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:53:06.370354" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.370229" 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-04-25T23:53:06.370937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.370676" 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-04-25T23:53:06.371746" level="INFO">${uri} = /restconf/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-04-25T23:53:06.371249" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.371019" 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-04-25T23:53:06.372000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.371836" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.370641" elapsed="0.001436"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:06.372112" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:53:06.372270" level="INFO">${uri} = /restconf/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-04-25T23:53:06.367488" elapsed="0.004808"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:06.372343" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:06.372486" level="INFO">${uri} = /restconf/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-04-25T23:53:06.366990" elapsed="0.005522"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.379821" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.379539" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.380263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.380019" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:06.385271" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.382594" elapsed="0.004402">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.380373" elapsed="0.006710">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.387323" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.387169" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.380354" elapsed="0.007059">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.387809" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.387944" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.387906" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.387888" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.388149" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.388220" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.375175" elapsed="0.013152">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.388399" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:06.372752" elapsed="0.015746">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.388684" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:53:06.388862" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.388924" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:53:06.355040" elapsed="0.033984">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.389187" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:53:06.353994" elapsed="0.035303">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:53:06.396756" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.400382" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:53:06.352613" elapsed="0.047892">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:53:06.400603" level="FAIL">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:52:55.862252" elapsed="10.538462">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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="FAIL" start="2026-04-25T23:52:55.861856" elapsed="10.539003">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait for the device to completely disappear.</doc>
<status status="FAIL" start="2026-04-25T23:52:55.758118" elapsed="10.642907">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t13" name="Configure_The_Device_Back" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:53:06.404446" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:53:06.404187" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.405749" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.405620" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.405601" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.410905" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.410796" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.410778" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.411979" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:53:06.411573" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.412463" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:53:06.412167" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:53:06.412534" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:06.412708" 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-04-25T23:53:06.411196" elapsed="0.001539"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.418370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.418262" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.418242" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.419643" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.419537" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.419520" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:06.420244" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.419885" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.420697" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.420425" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.421546" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.421270" elapsed="0.001251">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:06.422724" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:53:06.422771" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.420883" elapsed="0.001911"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.423621" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.423345" elapsed="0.001371">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:06.424894" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:53:06.424939" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.422959" elapsed="0.002003"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.425941" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.425306" elapsed="0.000715">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.425078" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.425057" elapsed="0.001094">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.426343" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.426572" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.426433" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.426416" elapsed="0.000270"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.426722" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.429785" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:53:06.430008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.429116" elapsed="0.000989"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.431143" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.432086" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.427559" elapsed="0.004642"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:06.426978" elapsed="0.005336"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.419239" elapsed="0.013160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</status>
</kw>
<msg time="2026-04-25T23:53:06.432501" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:06.432546" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Configure_The_Device_Back"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.418587" elapsed="0.013983"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.432773" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.432647" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.432628" 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-04-25T23:53:06.433820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.433713" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.433694" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.434155" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:06.434276" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:06.434035" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.434803" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.434455" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.435296" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.435051" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.435875" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:53:06.436296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:53:06.436343" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.435495" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.437193" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.439456" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.438983" elapsed="0.001040">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.437588" elapsed="0.002513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:53:06.441608" elapsed="0.000383"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.440337" elapsed="0.001718"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:53:06.436683" elapsed="0.005476"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.436443" elapsed="0.005769"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.436424" elapsed="0.005816"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:06.443309" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.442910" elapsed="0.000425"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:53:06.443383" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:06.443534" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.442478" elapsed="0.001080"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.443725" elapsed="0.000411"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.444409" level="INFO">index=30
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:53:06.444303" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.444696" elapsed="0.002548"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.447686" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:53:06.448790" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.447407" elapsed="0.001753">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.459521" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:53:06.459911" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.458144" elapsed="0.001855"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.460323" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.460580" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.449952" elapsed="0.010797"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:06.449428" elapsed="0.011370"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.433401" elapsed="0.027479">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.461209" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.461281" 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="FAIL" start="2026-04-25T23:53:06.417904" elapsed="0.043488">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:53:06.461496" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:06.461539" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.413099" elapsed="0.048463"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.461947" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.461695" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.461672" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:53:06.412958" elapsed="0.049088"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:53:06.412787" elapsed="0.049289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:53:06.410400" elapsed="0.051729"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:53:06.405333" elapsed="0.056850"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.404902" elapsed="0.057325"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:53:06.402018" elapsed="0.060260"/>
</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-04-25T23:53:06.482013" elapsed="0.000417"/>
</kw>
<msg time="2026-04-25T23:53:06.482495" 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-04-25T23:53:06.481642" elapsed="0.000902"/>
</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-04-25T23:53:06.481260" elapsed="0.001359"/>
</kw>
<msg time="2026-04-25T23:53:06.482675" 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-04-25T23:53:06.472613" elapsed="0.010107"/>
</kw>
<msg time="2026-04-25T23:53:06.482823" 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-04-25T23:53:06.472295" elapsed="0.010552"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.483744" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:53:06.483009" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:53:06.516446" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:53:06.516063" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:53:06.517225" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:53:06.516985" elapsed="0.000310">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:53:06.517387" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:53:06.516639" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.517971" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:53:06.517572" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:53:06.518292" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:53:06.518447" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:53:06.518155" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.518966" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.518622" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.519983" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.519722" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.520451" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.520185" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.521379" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:53:06.520861" elapsed="0.000544"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.522553" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.522064" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.522762" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:06.522997" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:53:06.521591" 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-04-25T23:53:06.523174" elapsed="0.000506"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:53:06.520728" elapsed="0.003000"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.524482" 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-04-25T23:53:06.523974" elapsed="0.000535"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.525811" 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-04-25T23:53:06.525302" elapsed="0.000550"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.525969" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:06.526197" 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-04-25T23:53:06.524717" elapsed="0.001506"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.526373" elapsed="0.000543"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:06.523843" elapsed="0.003115"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.527729" 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-04-25T23:53:06.527205" elapsed="0.000551"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.528880" 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-04-25T23:53:06.528377" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.529037" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:06.529263" 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-04-25T23:53:06.527939" elapsed="0.001350"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.529437" elapsed="0.000509"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:53:06.527072" elapsed="0.002916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.530836" 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-04-25T23:53:06.530230" elapsed="0.000633"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.531977" 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-04-25T23:53:06.531482" elapsed="0.000536"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.532133" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:06.532358" 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-04-25T23:53:06.531046" elapsed="0.001337"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.532530" elapsed="0.000494"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:53:06.530100" elapsed="0.002967"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.533837" 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-04-25T23:53:06.533308" elapsed="0.000556"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.535133" 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-04-25T23:53:06.534520" elapsed="0.000655"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.535291" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:06.535519" 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-04-25T23:53:06.534047" elapsed="0.001498"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.535710" elapsed="0.000476"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:53:06.533178" elapsed="0.003051"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.536996" 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-04-25T23:53:06.536472" elapsed="0.000551"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.538144" 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-04-25T23:53:06.537642" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.538301" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:06.538530" 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-04-25T23:53:06.537207" elapsed="0.001348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.538816" elapsed="0.000482"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:53:06.536342" elapsed="0.003001"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.540103" 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-04-25T23:53:06.539585" elapsed="0.000544"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.543028" 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-04-25T23:53:06.540859" elapsed="0.002210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.543194" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:53:06.543421" 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-04-25T23:53:06.540400" elapsed="0.003047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.543598" elapsed="0.000496"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:53:06.539455" elapsed="0.004682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.544901" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:53:06.544383" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:53:06.546054" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.545551" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:53:06.546208" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:06.546436" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:53:06.545113" elapsed="0.001349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.546613" elapsed="0.000603"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:53:06.544251" elapsed="0.003007"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:53:06.520528" elapsed="0.026765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:53:06.547337" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:53:06.547501" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:53:06.519384" elapsed="0.028144"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.519085" elapsed="0.028474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.547751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.547585" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.519064" elapsed="0.028765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.548640" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:create-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-04-25T23:53:06.547969" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:53:06.548735" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:53:06.515316" elapsed="0.033547"/>
</kw>
<msg time="2026-04-25T23:53:06.548958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.502619" elapsed="0.046389"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.561805" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.574318" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.586814" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.587040" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.587216" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.587577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.587435" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.587420" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.587814" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.587979" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.588143" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:53:06.587393" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.587292" 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-04-25T23:53:06.588363" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.588438" elapsed="0.000014"/>
</return>
<msg time="2026-04-25T23:53:06.588545" level="INFO">${uri} = /restconf/operations/netconf-node-topology:create-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-04-25T23:53:06.498295" elapsed="0.090276"/>
</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-04-25T23:53:06.613623" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:53:06.613243" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:53:06.614408" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:53:06.614198" elapsed="0.000274">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:53:06.614565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:53:06.613866" elapsed="0.000724"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.615179" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/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-04-25T23:53:06.614770" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:53:06.615502" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:53:06.615632" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/usern...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:53:06.615367" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.616088" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/username&gt;
     &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.615838" 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-04-25T23:53:06.616492" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.616206" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.617035" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:06.616736" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.616575" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.616187" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.617946" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:53:06.617263" elapsed="0.000715"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:53:06.618028" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:53:06.612613" elapsed="0.005541"/>
</kw>
<msg time="2026-04-25T23:53:06.618208" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.599703" elapsed="0.018553"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.630837" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.643286" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.655889" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.656080" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.656252" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.656610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.656470" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.656454" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.656846" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.657009" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.657171" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:53:06.656427" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.656325" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.657389" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.657463" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:53:06.657583" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:53:06.598822" elapsed="0.058789"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:53:06.658869" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.658612" elapsed="0.000320">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:53:06.659023" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:53:06.658278" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.659377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.659117" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.659939" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:06.659627" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.659458" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.659099" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.662529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:53:06.660171" elapsed="0.002385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:53:06.662608" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:53:06.662784" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:53:06.657958" elapsed="0.004851"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.664423" level="INFO">/restconf/operations/netconf-node-topology:create-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.664172" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.664928" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&gt;
     &lt;password&gt;topsecret&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.664680" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.665380" 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-04-25T23:53:06.665128" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.665836" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.665571" elapsed="0.000309"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:06.666688" 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-04-25T23:53:06.666477" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:53:06.667043" 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-04-25T23:53:06.666868" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.667216" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.667868" 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-04-25T23:53:06.667599" elapsed="0.000313"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:53:06.667954" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:06.668110" 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-04-25T23:53:06.666078" elapsed="0.002057"/>
</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">
<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="NOT RUN" start="2026-04-25T23:53:06.670304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.668206" elapsed="0.002164"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:06.673239" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:53:06.670532" elapsed="0.004385">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.670394" elapsed="0.004611">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.668188" elapsed="0.006850">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.675433" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.675569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.675532" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.675515" 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-04-25T23:53:06.675795" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.675863" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.663131" elapsed="0.012837">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.676051" 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-04-25T23:53:06.487085" elapsed="0.189097">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:06.676478" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.676300" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.676283" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.676601" elapsed="0.000015"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.484169" elapsed="0.192547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.483859" elapsed="0.192926">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.677055" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.676816" elapsed="0.000304"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.483840" elapsed="0.193304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:53:06.677296" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type_rpc_create}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.462579" elapsed="0.214830">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure the device again.
This is the second step of the device configuration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:53:06.401421" elapsed="0.276144">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t14" name="Wait_For_Device_To_Reconnect" line="132">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:53:06.681198" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:53:06.680932" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.682460" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.682351" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.682332" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.687538" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.687427" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.687378" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.688600" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:53:06.688220" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.689106" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:53:06.688811" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:53:06.689175" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:53:06.689328" 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-04-25T23:53:06.687847" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.694943" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.694834" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.694815" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.696256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.696149" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.696131" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:06.696846" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.696466" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.697275" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.697030" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.698126" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.697858" elapsed="0.001287">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:06.699325" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:53:06.699370" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.697459" elapsed="0.001935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.700296" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.700021" elapsed="0.001299">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:06.701538" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:53:06.701584" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.699609" elapsed="0.001998"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.702574" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.701951" elapsed="0.000741">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.701714" elapsed="0.001076">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.701690" elapsed="0.001135">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.702986" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.703211" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.703072" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.703054" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.703339" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.706489" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:53:06.706739" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.705820" elapsed="0.001017"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.707810" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.708780" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.704248" elapsed="0.004645"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:06.703642" elapsed="0.005365"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.695845" elapsed="0.013247">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</status>
</kw>
<msg time="2026-04-25T23:53:06.709195" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:06.709238" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Wait_For_Device_To_Reconnect"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.695161" elapsed="0.014142"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.709493" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.709384" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.709364" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.710368" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.710263" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.710246" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.710729" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:06.710832" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:06.710583" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.711265" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.711008" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.711748" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.711459" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.712312" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:53:06.712768" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:53:06.712814" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.711956" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.713633" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.715935" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.715306" elapsed="0.001177">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.714044" elapsed="0.002516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:53:06.718231" elapsed="0.000356"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.717003" elapsed="0.001647"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:53:06.713132" elapsed="0.005638"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.712914" elapsed="0.005907"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.712895" elapsed="0.005952"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:06.719821" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.719372" elapsed="0.000476"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:53:06.719897" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:06.720050" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.719050" elapsed="0.001025"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.720230" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.720951" level="INFO">index=31
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:53:06.720845" elapsed="0.000260"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:06.721262" elapsed="0.002323"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:53:06.724032" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:53:06.725059" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.723762" elapsed="0.001671">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:06.735805" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:53:06.736179" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:06.734446" elapsed="0.001822"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.736592" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.737018" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:53:06.726272" elapsed="0.010887"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:06.725761" elapsed="0.011448"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.709967" elapsed="0.027324">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.737627" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.737719" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.694473" elapsed="0.043352">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:53:06.737932" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:06.737976" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.689775" elapsed="0.048225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.738326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.738078" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.738060" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:53:06.689615" elapsed="0.048810"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:53:06.689440" elapsed="0.049018"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:53:06.687034" elapsed="0.051481"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:53:06.682063" elapsed="0.056510"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:06.681614" elapsed="0.057006"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:53:06.678475" elapsed="0.060217"/>
</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-04-25T23:53:06.751061" 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-04-25T23:53:06.748975" elapsed="0.002113"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.751804" 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-04-25T23:53:06.751431" elapsed="0.000401"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:06.751281" elapsed="0.000587"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.752414" 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-04-25T23:53:06.752096" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:06.751946" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:06.751144" 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-04-25T23:53:06.752823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.752568" 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-04-25T23:53:06.753598" level="INFO">${uri} = /restconf/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-04-25T23:53:06.753132" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:06.752903" 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-04-25T23:53:06.753919" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.753750" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:06.752551" elapsed="0.001444"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:06.754029" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:53:06.754179" level="INFO">${uri} = /restconf/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-04-25T23:53:06.748490" elapsed="0.005714"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:06.754252" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:06.754395" level="INFO">${uri} = /restconf/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-04-25T23:53:06.747935" elapsed="0.006486"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.761900" level="INFO">/restconf/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-04-25T23:53:06.761609" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:06.762408" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:06.762153" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:06.767017" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.764673" elapsed="0.004035">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:06.762518" elapsed="0.006277">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.768979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:06.768829" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:06.762500" elapsed="0.006567">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.769452" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.769586" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:06.769548" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:06.769530" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:06.769813" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.769884" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.757135" elapsed="0.012854">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:06.770060" 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-04-25T23:53:06.754643" elapsed="0.015512">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:06.770364" 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-04-25T23:53:06.739887" elapsed="0.030590">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:07.787718" 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-04-25T23:53:07.785560" elapsed="0.002215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:07.788478" 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-04-25T23:53:07.788148" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:07.787989" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:07.789108" 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-04-25T23:53:07.788787" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:07.788622" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:07.787845" 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-04-25T23:53:07.789531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:07.789271" 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-04-25T23:53:07.790330" level="INFO">${uri} = /restconf/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-04-25T23:53:07.789862" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:07.789614" 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-04-25T23:53:07.790582" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:07.790421" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:07.789250" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:07.790714" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:53:07.790881" level="INFO">${uri} = /restconf/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-04-25T23:53:07.785086" elapsed="0.005821"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:07.790955" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:07.791098" level="INFO">${uri} = /restconf/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-04-25T23:53:07.784484" elapsed="0.006640"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:07.798760" level="INFO">/restconf/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-04-25T23:53:07.798484" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:07.799199" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:07.798957" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:07.804095" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:07.801391" elapsed="0.004420">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:07.799308" elapsed="0.006590">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:07.806099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:07.805934" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:07.799289" elapsed="0.006961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:07.806622" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:07.806779" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:07.806742" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:07.806722" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:07.806981" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:07.807052" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:07.794172" elapsed="0.012985">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:07.807229" 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-04-25T23:53:07.791347" elapsed="0.015978">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:07.807492" 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-04-25T23:53:07.771354" elapsed="0.036247">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:08.825984" 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-04-25T23:53:08.823820" elapsed="0.002196"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:08.826726" 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-04-25T23:53:08.826381" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:08.826228" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:08.827339" 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-04-25T23:53:08.827020" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:08.826870" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:08.826087" 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-04-25T23:53:08.827793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:08.827513" 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-04-25T23:53:08.828572" level="INFO">${uri} = /restconf/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-04-25T23:53:08.828103" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:08.827875" elapsed="0.000762"/>
</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-04-25T23:53:08.828841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:08.828678" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:08.827493" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:08.828954" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:53:08.829115" level="INFO">${uri} = /restconf/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-04-25T23:53:08.823114" elapsed="0.006091"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:08.829256" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:08.829402" level="INFO">${uri} = /restconf/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-04-25T23:53:08.822299" elapsed="0.007129"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:08.836849" level="INFO">/restconf/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-04-25T23:53:08.836568" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:08.837289" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:08.837048" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:08.842430" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:08.839606" elapsed="0.004544">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:08.837400" elapsed="0.006835">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:08.844420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:08.844270" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:08.837382" elapsed="0.007127">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:08.844896" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:08.845029" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:08.844992" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:08.844975" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:08.845230" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:08.845300" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:08.832158" elapsed="0.013246">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:08.845476" 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-04-25T23:53:08.829670" elapsed="0.015900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:08.845755" 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-04-25T23:53:08.808430" elapsed="0.037441">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:09.858067" 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-04-25T23:53:09.855908" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:09.858832" 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-04-25T23:53:09.858472" elapsed="0.000388"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:09.858319" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:09.859445" 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-04-25T23:53:09.859125" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:09.858977" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:09.858173" 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-04-25T23:53:09.859888" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:09.859610" 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-04-25T23:53:09.860684" level="INFO">${uri} = /restconf/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-04-25T23:53:09.860199" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:09.859971" 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-04-25T23:53:09.860937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:09.860776" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:09.859589" elapsed="0.001424"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:09.861051" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:53:09.861216" level="INFO">${uri} = /restconf/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-04-25T23:53:09.855408" elapsed="0.005834"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:09.861290" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:09.861431" level="INFO">${uri} = /restconf/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-04-25T23:53:09.854816" elapsed="0.006640"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:09.868999" level="INFO">/restconf/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-04-25T23:53:09.868735" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:09.869437" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:09.869197" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:09.874461" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:09.871711" elapsed="0.004464">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:09.869547" elapsed="0.006713">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:09.876443" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:09.876294" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:09.869528" elapsed="0.007002">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:09.876925" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:09.877120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:09.877082" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:09.877064" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:09.877323" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:09.877393" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:09.864386" elapsed="0.013112">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:09.877570" 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-04-25T23:53:09.861695" elapsed="0.015987">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:09.877859" 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-04-25T23:53:09.846922" elapsed="0.031047">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:10.894088" 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-04-25T23:53:10.891894" elapsed="0.002227"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:10.894868" 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-04-25T23:53:10.894511" elapsed="0.000386"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:10.894343" elapsed="0.000592"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:10.895511" 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-04-25T23:53:10.895173" elapsed="0.000367"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:10.895018" elapsed="0.000559"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:10.894196" 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-04-25T23:53:10.895966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:10.895700" 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-04-25T23:53:10.896801" level="INFO">${uri} = /restconf/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-04-25T23:53:10.896287" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:10.896052" elapsed="0.000817"/>
</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-04-25T23:53:10.897060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:10.896894" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:10.895677" elapsed="0.001464"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:10.897178" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:53:10.897342" level="INFO">${uri} = /restconf/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-04-25T23:53:10.891375" elapsed="0.005994"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:10.897419" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:53:10.897605" level="INFO">${uri} = /restconf/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-04-25T23:53:10.890790" elapsed="0.006843"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:10.905098" level="INFO">/restconf/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-04-25T23:53:10.904839" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:10.905544" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:10.905298" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:10.910464" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:10.907806" elapsed="0.004345">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:10.905701" elapsed="0.006535">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:10.912422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:10.912271" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:10.905681" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:10.914478" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:10.914621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:10.914583" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:10.914565" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:10.914852" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:10.914924" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:10.900448" elapsed="0.014582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:10.915102" 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-04-25T23:53:10.897881" elapsed="0.017316">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:10.915364" 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-04-25T23:53:10.878846" elapsed="0.036627">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:11.932038" 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-04-25T23:53:11.929873" elapsed="0.002197"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:11.932800" 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-04-25T23:53:11.932454" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:11.932297" elapsed="0.000572"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:11.933499" 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-04-25T23:53:11.933179" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:11.933029" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:11.932151" 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-04-25T23:53:11.933945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:11.933679" 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-04-25T23:53:11.934743" level="INFO">${uri} = /restconf/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-04-25T23:53:11.934254" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:11.934027" 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-04-25T23:53:11.934994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:11.934832" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:11.933642" elapsed="0.001429"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:11.935108" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:11.935267" level="INFO">${uri} = /restconf/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-04-25T23:53:11.929379" elapsed="0.005914"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:11.935340" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:11.935482" level="INFO">${uri} = /restconf/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-04-25T23:53:11.928774" elapsed="0.006733"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:11.942856" level="INFO">/restconf/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-04-25T23:53:11.942574" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:11.943300" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:11.943057" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:11.948244" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:11.945638" elapsed="0.004301">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:11.943412" elapsed="0.006611">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:11.950209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:11.950058" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:11.943393" elapsed="0.006904">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:11.950685" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:11.950819" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:11.950782" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:11.950765" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:11.951021" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:11.951090" 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-04-25T23:53:11.938231" elapsed="0.013001">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:11.951306" 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-04-25T23:53:11.935747" elapsed="0.015655">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:11.951571" 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-04-25T23:53:11.916247" elapsed="0.035451">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:12.967175" 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-04-25T23:53:12.964956" elapsed="0.002253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:12.967937" 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-04-25T23:53:12.967583" elapsed="0.000381"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:12.967427" elapsed="0.000574"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:12.968550" 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-04-25T23:53:12.968231" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:12.968081" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:12.967281" elapsed="0.001361"/>
</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-04-25T23:53:12.968998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:12.968733" 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-04-25T23:53:12.969797" level="INFO">${uri} = /restconf/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-04-25T23:53:12.969310" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:12.969079" 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-04-25T23:53:12.970050" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:12.969887" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:12.968711" elapsed="0.001414"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:12.970163" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:53:12.970325" level="INFO">${uri} = /restconf/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-04-25T23:53:12.964422" elapsed="0.005929"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:12.970398" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:12.970567" level="INFO">${uri} = /restconf/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-04-25T23:53:12.963841" elapsed="0.006752"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:12.978179" level="INFO">/restconf/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-04-25T23:53:12.977922" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:12.978649" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:12.978379" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:12.983416" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:12.980847" elapsed="0.004327">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:12.978777" elapsed="0.006481">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:12.985446" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:12.985294" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:12.978758" elapsed="0.006776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:12.985935" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:12.986070" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:12.986032" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:12.986015" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:12.986273" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:12.986342" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:12.973534" elapsed="0.012913">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:12.986552" 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-04-25T23:53:12.970833" elapsed="0.015817">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:12.986836" 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-04-25T23:53:12.952520" elapsed="0.034431">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:14.004243" 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-04-25T23:53:14.001876" elapsed="0.002399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:14.005031" 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-04-25T23:53:14.004695" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:14.004494" elapsed="0.000607"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:14.005680" 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-04-25T23:53:14.005337" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:14.005183" elapsed="0.000562"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:14.004347" elapsed="0.001427"/>
</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-04-25T23:53:14.006108" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:14.005847" 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-04-25T23:53:14.007008" level="INFO">${uri} = /restconf/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-04-25T23:53:14.006442" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:14.006191" elapsed="0.000883"/>
</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-04-25T23:53:14.007264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:14.007100" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:14.005826" elapsed="0.001516"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:14.007385" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:53:14.007551" level="INFO">${uri} = /restconf/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-04-25T23:53:14.001375" elapsed="0.006203"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:14.007627" elapsed="0.000043"/>
</return>
<msg time="2026-04-25T23:53:14.007793" level="INFO">${uri} = /restconf/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-04-25T23:53:14.000780" 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-04-25T23:53:14.015284" level="INFO">/restconf/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-04-25T23:53:14.015026" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:14.015758" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:14.015489" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:14.020632" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:14.017963" elapsed="0.004378">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:14.015872" elapsed="0.006555">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:14.022627" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:14.022463" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:14.015852" elapsed="0.006890">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:14.023121" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:14.023259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:14.023221" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:14.023203" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:14.023466" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:14.023539" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:14.010575" elapsed="0.013095">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:14.023747" 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-04-25T23:53:14.008047" elapsed="0.015799">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:14.024061" 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-04-25T23:53:13.987849" elapsed="0.036326">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:15.041737" 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-04-25T23:53:15.039584" elapsed="0.002186"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:15.042578" 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-04-25T23:53:15.042130" elapsed="0.000482"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:15.041977" elapsed="0.000674"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:15.043248" 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-04-25T23:53:15.042911" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:15.042747" elapsed="0.000564"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:15.041837" 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-04-25T23:53:15.043690" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:15.043410" 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-04-25T23:53:15.044471" level="INFO">${uri} = /restconf/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-04-25T23:53:15.044002" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:15.043773" elapsed="0.000762"/>
</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-04-25T23:53:15.044736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:15.044560" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:15.043390" elapsed="0.001422"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:15.044849" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:53:15.045007" level="INFO">${uri} = /restconf/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-04-25T23:53:15.039106" elapsed="0.005927"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:15.045080" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:15.045224" level="INFO">${uri} = /restconf/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-04-25T23:53:15.038306" elapsed="0.006944"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:15.052606" level="INFO">/restconf/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-04-25T23:53:15.052351" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:15.053061" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:15.052819" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:15.057878" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:15.055236" elapsed="0.004332">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:15.053171" elapsed="0.006500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:15.059932" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:15.059770" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:15.053152" elapsed="0.006886">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:15.060410" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:15.060542" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:15.060505" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:15.060487" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:15.060759" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:15.060830" 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-04-25T23:53:15.047990" elapsed="0.012945">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:15.061011" 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-04-25T23:53:15.045475" elapsed="0.015632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:15.061275" 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-04-25T23:53:15.025062" elapsed="0.036323">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:16.079902" 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-04-25T23:53:16.077618" elapsed="0.002323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:16.080753" 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-04-25T23:53:16.080402" elapsed="0.000378"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:16.080206" elapsed="0.000610"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:16.081374" 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-04-25T23:53:16.081057" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:16.080900" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:16.080025" 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-04-25T23:53:16.081836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:16.081546" 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-04-25T23:53:16.082618" level="INFO">${uri} = /restconf/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-04-25T23:53:16.082153" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:16.081920" 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-04-25T23:53:16.082885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:16.082722" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:16.081523" elapsed="0.001438"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:16.083002" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:53:16.083259" level="INFO">${uri} = /restconf/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-04-25T23:53:16.077114" elapsed="0.006171"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:16.083334" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:16.083476" level="INFO">${uri} = /restconf/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-04-25T23:53:16.076291" elapsed="0.007211"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:16.090948" level="INFO">/restconf/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-04-25T23:53:16.090683" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:16.091389" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:16.091146" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:16.096840" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:16.093765" elapsed="0.004785">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:16.091499" elapsed="0.007140">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:16.098847" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:16.098692" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:16.091480" elapsed="0.007455">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:16.099314" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:16.099446" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:16.099410" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:16.099393" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:16.099646" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:16.099731" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:16.086292" elapsed="0.013548">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:16.099909" 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-04-25T23:53:16.083743" elapsed="0.016260">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:16.100169" elapsed="0.000224"/>
</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-04-25T23:53:16.062332" elapsed="0.038159">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:17.117531" 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-04-25T23:53:17.115317" elapsed="0.002251"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:17.118348" 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-04-25T23:53:17.118013" elapsed="0.000363"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:17.117855" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:17.118988" 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-04-25T23:53:17.118647" elapsed="0.000369"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:17.118497" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:17.117647" 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-04-25T23:53:17.119434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:17.119161" 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-04-25T23:53:17.120247" level="INFO">${uri} = /restconf/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-04-25T23:53:17.119770" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:17.119518" 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-04-25T23:53:17.120517" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:17.120343" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:17.119138" elapsed="0.001463"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:17.120640" elapsed="0.000056"/>
</return>
<msg time="2026-04-25T23:53:17.120829" level="INFO">${uri} = /restconf/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-04-25T23:53:17.114818" elapsed="0.006038"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:17.120904" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:17.121048" level="INFO">${uri} = /restconf/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-04-25T23:53:17.114201" elapsed="0.006872"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:17.128887" level="INFO">/restconf/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-04-25T23:53:17.128602" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:17.129332" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:17.129088" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:17.134369" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:17.131532" elapsed="0.004596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:17.129454" elapsed="0.006761">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:17.136403" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:17.136251" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:17.129427" elapsed="0.007066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:17.136885" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:17.137085" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:17.137047" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:17.137028" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:17.137291" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:17.137363" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:17.124080" elapsed="0.013403">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:17.137560" 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-04-25T23:53:17.121299" elapsed="0.016376">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:17.137869" 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-04-25T23:53:17.101439" elapsed="0.036544">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:18.157742" 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-04-25T23:53:18.155584" elapsed="0.002191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:18.158470" 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-04-25T23:53:18.158148" elapsed="0.000348"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:18.157992" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:18.159090" 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-04-25T23:53:18.158776" elapsed="0.000341"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:18.158612" elapsed="0.000539"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:18.157847" 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-04-25T23:53:18.159538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:18.159276" 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-04-25T23:53:18.160333" level="INFO">${uri} = /restconf/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-04-25T23:53:18.159866" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:18.159619" 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-04-25T23:53:18.160580" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:18.160420" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:18.159254" elapsed="0.001416"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:18.160708" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:53:18.160868" level="INFO">${uri} = /restconf/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-04-25T23:53:18.155094" elapsed="0.005799"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:18.160940" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:18.161087" level="INFO">${uri} = /restconf/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-04-25T23:53:18.154497" elapsed="0.006614"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:18.168493" level="INFO">/restconf/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-04-25T23:53:18.168236" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:18.168948" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:18.168706" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:18.173912" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:18.171243" elapsed="0.004391">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:18.169056" elapsed="0.006684">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:18.175926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:18.175776" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:18.169038" elapsed="0.006976">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:18.176539" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:18.176690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:18.176636" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:18.176620" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:18.176893" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:18.176962" 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-04-25T23:53:18.163891" elapsed="0.013176">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:18.177137" 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-04-25T23:53:18.161334" elapsed="0.015897">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:18.177395" 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-04-25T23:53:18.138886" elapsed="0.038615">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:19.193240" 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-04-25T23:53:19.191005" elapsed="0.002267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:19.193983" 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-04-25T23:53:19.193642" elapsed="0.000369"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:19.193487" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:19.194706" 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-04-25T23:53:19.194363" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:19.194213" elapsed="0.000557"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:19.193343" elapsed="0.001457"/>
</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-04-25T23:53:19.195136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:19.194873" 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-04-25T23:53:19.195941" level="INFO">${uri} = /restconf/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-04-25T23:53:19.195454" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:19.195217" 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-04-25T23:53:19.196193" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:19.196031" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:19.194852" elapsed="0.001417"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:19.196306" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:19.196466" level="INFO">${uri} = /restconf/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-04-25T23:53:19.190508" elapsed="0.006012"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:19.196579" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:53:19.196764" level="INFO">${uri} = /restconf/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-04-25T23:53:19.189919" elapsed="0.006871"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:19.204247" level="INFO">/restconf/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-04-25T23:53:19.203989" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:19.204766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:19.204442" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:19.209760" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:19.207024" elapsed="0.004412">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:19.204877" elapsed="0.006643">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:19.211722" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:19.211554" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:19.204859" elapsed="0.006951">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:19.212187" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:19.212319" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:19.212281" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:19.212264" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:19.212557" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:19.212641" 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-04-25T23:53:19.199464" elapsed="0.013347">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:19.212885" 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-04-25T23:53:19.197014" elapsed="0.015967">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:19.213151" 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-04-25T23:53:19.178310" elapsed="0.034950">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:20.229734" 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-04-25T23:53:20.227356" elapsed="0.002417"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:20.230469" 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-04-25T23:53:20.230143" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:20.229991" elapsed="0.000540"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:20.231099" 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-04-25T23:53:20.230776" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:20.230611" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:20.229844" 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-04-25T23:53:20.231522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:20.231261" 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-04-25T23:53:20.232320" level="INFO">${uri} = /restconf/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-04-25T23:53:20.231851" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:20.231605" 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-04-25T23:53:20.232572" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:20.232410" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:20.231241" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:20.232702" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:53:20.232864" level="INFO">${uri} = /restconf/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-04-25T23:53:20.226878" elapsed="0.006013"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:20.232938" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:20.233081" level="INFO">${uri} = /restconf/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-04-25T23:53:20.226278" 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-04-25T23:53:20.240547" level="INFO">/restconf/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-04-25T23:53:20.240286" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:20.241007" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:20.240762" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:20.246043" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:20.243237" elapsed="0.004611">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:20.241124" elapsed="0.006810">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:20.248131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:20.247968" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:20.241104" elapsed="0.007117">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:20.248591" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:20.248747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:20.248709" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:20.248691" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:20.248955" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:20.249027" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:20.235891" elapsed="0.013242">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:20.249206" 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-04-25T23:53:20.233340" elapsed="0.015962">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:20.249470" 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-04-25T23:53:20.214130" elapsed="0.035452">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:21.270109" 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-04-25T23:53:21.267988" elapsed="0.002151"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:21.270845" 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-04-25T23:53:21.270492" elapsed="0.000380"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:21.270341" elapsed="0.000568"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:21.271461" 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-04-25T23:53:21.271143" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:21.270989" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:21.270202" 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-04-25T23:53:21.271887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:21.271618" 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-04-25T23:53:21.272745" level="INFO">${uri} = /restconf/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-04-25T23:53:21.272194" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:21.271968" elapsed="0.000840"/>
</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-04-25T23:53:21.272992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:21.272833" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:21.271599" elapsed="0.001467"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:21.273101" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:53:21.273254" level="INFO">${uri} = /restconf/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-04-25T23:53:21.267499" elapsed="0.005781"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:21.273325" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:53:21.273465" level="INFO">${uri} = /restconf/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-04-25T23:53:21.266728" elapsed="0.006762"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:21.280789" level="INFO">/restconf/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-04-25T23:53:21.280521" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:21.281229" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:21.280987" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:21.286089" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:21.283502" elapsed="0.004313">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:21.281338" elapsed="0.006561">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:21.288085" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:21.287934" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:21.281320" elapsed="0.006852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:21.288540" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:21.288688" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:21.288634" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:21.288617" 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-04-25T23:53:21.288891" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:21.288959" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:21.276197" elapsed="0.012865">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:21.289131" 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-04-25T23:53:21.273724" elapsed="0.015501">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:21.289423" 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-04-25T23:53:21.250350" elapsed="0.039182">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:22.307207" 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-04-25T23:53:22.305000" elapsed="0.002242"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:22.307987" 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-04-25T23:53:22.307622" elapsed="0.000393"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:22.307467" elapsed="0.000584"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:22.308602" 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-04-25T23:53:22.308284" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:22.308133" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:22.307316" 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-04-25T23:53:22.309052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:22.308785" 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-04-25T23:53:22.309852" level="INFO">${uri} = /restconf/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-04-25T23:53:22.309363" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:22.309134" 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-04-25T23:53:22.310106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:22.309943" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:22.308762" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:22.310220" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:53:22.310386" level="INFO">${uri} = /restconf/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-04-25T23:53:22.304483" elapsed="0.005930"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:22.310460" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:22.310602" level="INFO">${uri} = /restconf/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-04-25T23:53:22.303878" elapsed="0.006750"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:22.318141" level="INFO">/restconf/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-04-25T23:53:22.317727" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:22.318587" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:22.318343" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:22.323831" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:22.320789" elapsed="0.004794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:22.318720" elapsed="0.006969">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:22.325939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:22.325784" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:22.318701" elapsed="0.007327">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:22.326421" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:22.326552" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:22.326516" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:22.326499" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:22.326770" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:22.326841" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:22.313373" elapsed="0.013573">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:22.327017" 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-04-25T23:53:22.310867" elapsed="0.016244">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:22.327278" 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-04-25T23:53:22.290462" elapsed="0.036924">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:23.345594" 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-04-25T23:53:23.342757" elapsed="0.002871"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:23.346341" 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-04-25T23:53:23.346012" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:23.345857" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:23.346974" 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-04-25T23:53:23.346642" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:23.346485" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:23.345711" elapsed="0.001353"/>
</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-04-25T23:53:23.347394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:23.347136" 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-04-25T23:53:23.348190" level="INFO">${uri} = /restconf/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-04-25T23:53:23.347720" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:23.347475" 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-04-25T23:53:23.348441" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:23.348279" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:23.347115" elapsed="0.001402"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:23.348553" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:23.348797" level="INFO">${uri} = /restconf/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-04-25T23:53:23.342069" elapsed="0.006754"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:23.348871" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:53:23.349026" level="INFO">${uri} = /restconf/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-04-25T23:53:23.341215" elapsed="0.007836"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:23.356323" level="INFO">/restconf/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-04-25T23:53:23.356069" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:23.356777" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:23.356520" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:23.362011" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:23.358937" elapsed="0.004778">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:23.356898" elapsed="0.006901">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:23.363982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:23.363834" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:23.356870" elapsed="0.007198">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:23.364443" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:23.364573" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:23.364537" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:23.364521" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:23.364788" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:23.364857" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:23.351751" elapsed="0.013224">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:23.365055" elapsed="0.000020"/>
</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-04-25T23:53:23.349272" elapsed="0.015892">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:23.365328" 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-04-25T23:53:23.328224" elapsed="0.037212">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:24.383087" 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-04-25T23:53:24.379941" elapsed="0.003196"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:24.383948" 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-04-25T23:53:24.383585" elapsed="0.000391"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:24.383399" elapsed="0.000612"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:24.384564" 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-04-25T23:53:24.384247" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:24.384096" elapsed="0.000530"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:24.383230" elapsed="0.001440"/>
</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-04-25T23:53:24.385037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:24.384759" 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-04-25T23:53:24.385841" level="INFO">${uri} = /restconf/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-04-25T23:53:24.385349" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:24.385121" 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-04-25T23:53:24.386092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:24.385930" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:24.384736" elapsed="0.001431"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:24.386207" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:53:24.386385" level="INFO">${uri} = /restconf/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-04-25T23:53:24.379429" elapsed="0.006985"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:24.386462" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:24.386604" level="INFO">${uri} = /restconf/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-04-25T23:53:24.378835" elapsed="0.007793"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:24.394073" level="INFO">/restconf/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-04-25T23:53:24.393792" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:24.394599" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:24.394271" 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-04-25T23:53:24.399740" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:24.396811" elapsed="0.004800">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:24.394733" elapsed="0.006982">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:24.401917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:24.401750" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:24.394713" elapsed="0.007299">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:24.402406" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:24.402620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:24.402583" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:24.402565" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:24.402843" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:24.402913" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:24.389412" elapsed="0.013609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:24.403091" 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-04-25T23:53:24.386871" elapsed="0.016318">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:24.403358" 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-04-25T23:53:24.366423" elapsed="0.037043">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:25.419959" 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-04-25T23:53:25.417794" elapsed="0.002197"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:25.420705" 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-04-25T23:53:25.420357" elapsed="0.000377"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:25.420202" elapsed="0.000569"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:25.421332" 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-04-25T23:53:25.421005" elapsed="0.000355"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:25.420853" elapsed="0.000542"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:25.420060" 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-04-25T23:53:25.421802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:25.421495" 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-04-25T23:53:25.422584" level="INFO">${uri} = /restconf/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-04-25T23:53:25.422114" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:25.421885" elapsed="0.000762"/>
</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-04-25T23:53:25.422850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:25.422688" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:25.421475" elapsed="0.001452"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:25.422964" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:53:25.423124" level="INFO">${uri} = /restconf/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-04-25T23:53:25.417299" elapsed="0.005851"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:25.423196" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:53:25.423339" level="INFO">${uri} = /restconf/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-04-25T23:53:25.416712" elapsed="0.006652"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:25.430976" level="INFO">/restconf/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-04-25T23:53:25.430580" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:25.431420" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:25.431176" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:25.436124" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:25.433627" elapsed="0.004195">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:25.431530" elapsed="0.006376">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:25.438091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:25.437941" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:25.431511" elapsed="0.006668">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:25.438557" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:25.438707" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:25.438655" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:25.438634" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:25.438910" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:25.438979" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:25.426203" elapsed="0.012880">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:25.439154" 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-04-25T23:53:25.423614" elapsed="0.015635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:25.439415" 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-04-25T23:53:25.404257" elapsed="0.035267">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:26.457254" 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-04-25T23:53:26.455119" elapsed="0.002168"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:26.457980" 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-04-25T23:53:26.457638" elapsed="0.000369"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:26.457486" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:26.458663" 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-04-25T23:53:26.458337" elapsed="0.000368"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:26.458186" elapsed="0.000554"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:26.457349" 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-04-25T23:53:26.459115" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:26.458840" 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-04-25T23:53:26.459928" level="INFO">${uri} = /restconf/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-04-25T23:53:26.459434" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:26.459199" 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-04-25T23:53:26.460180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:26.460018" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:26.458821" elapsed="0.001437"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:26.460297" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:53:26.460453" level="INFO">${uri} = /restconf/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-04-25T23:53:26.454632" elapsed="0.005848"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:26.460528" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:53:26.460694" level="INFO">${uri} = /restconf/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-04-25T23:53:26.453984" 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-04-25T23:53:26.468178" level="INFO">/restconf/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-04-25T23:53:26.467919" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:26.468623" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:26.468378" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:26.474070" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:26.471042" elapsed="0.004745">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:26.468760" elapsed="0.007113">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:26.476061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:26.475908" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:26.468737" elapsed="0.007412">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:26.476517" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:26.476649" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:26.476612" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:26.476595" 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-04-25T23:53:26.476871" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:26.476941" 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-04-25T23:53:26.463549" elapsed="0.013534">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:26.477157" 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-04-25T23:53:26.460984" elapsed="0.016272">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:26.477427" 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-04-25T23:53:26.440237" elapsed="0.037342">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:27.494613" 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-04-25T23:53:27.492246" elapsed="0.002412"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.495448" 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-04-25T23:53:27.495104" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:53:27.494929" elapsed="0.000585"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.496165" 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-04-25T23:53:27.495770" elapsed="0.000424"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:53:27.495600" elapsed="0.000632"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:53:27.494763" 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-04-25T23:53:27.496628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.496350" elapsed="0.000354"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.497501" level="INFO">${uri} = /restconf/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-04-25T23:53:27.496965" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:27.496732" elapsed="0.000835"/>
</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-04-25T23:53:27.497774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.497592" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.496325" elapsed="0.001527"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:27.497894" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:53:27.498087" level="INFO">${uri} = /restconf/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-04-25T23:53:27.491725" elapsed="0.006400"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:53:27.498194" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:53:27.498353" level="INFO">${uri} = /restconf/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-04-25T23:53:27.491074" elapsed="0.007305"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.506271" level="INFO">/restconf/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-04-25T23:53:27.505966" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.506770" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:27.506496" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:27.512073" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.508998" elapsed="0.005006">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:27.506883" elapsed="0.007229">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.514313" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.514158" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:27.506864" elapsed="0.007538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.514846" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.514993" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.514955" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:27.514935" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.515199" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.515268" 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-04-25T23:53:27.501463" elapsed="0.013920">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.515454" 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-04-25T23:53:27.498609" elapsed="0.016943">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:27.515768" 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-04-25T23:53:27.478647" elapsed="0.037239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:53:27.515990" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:53:06.739308" elapsed="20.776781">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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-04-25T23:53:06.738904" elapsed="20.777303">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:53:06.677928" elapsed="20.838458">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t15" name="Check_Modified_Device_Data_Is_Still_There" line="136">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:53:27.520122" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:53:27.519841" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.521562" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.521415" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.521396" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.526955" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.526818" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.526799" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.528135" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:53:27.527638" elapsed="0.000529"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.528658" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:53:27.528356" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:53:27.528745" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:53:27.528901" 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-04-25T23:53:27.527256" elapsed="0.001670"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.534538" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.534427" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.534408" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.535893" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.535783" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.535765" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:27.536468" 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-04-25T23:53:27.536106" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.536929" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:27.536658" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.537881" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.537512" elapsed="0.001294">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:27.538990" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:53:27.539036" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.537115" elapsed="0.001944"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.539937" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.539621" elapsed="0.001474">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:53:27.541273" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:53:27.541319" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.539228" elapsed="0.002114"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.542437" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.541639" elapsed="0.000879">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:27.541417" elapsed="0.001194">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:53:27.541398" elapsed="0.001248">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.542825" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.543101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.542959" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:27.542940" elapsed="0.000261"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.543234" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:27.546415" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:53:27.546636" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:27.545594" elapsed="0.001157"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.547682" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.548614" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:53:27.544105" elapsed="0.004730"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:27.543498" elapsed="0.005453"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.535452" elapsed="0.013584">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</status>
</kw>
<msg time="2026-04-25T23:53:27.549137" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:27.549180" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Modified_Device_Data_Is_Still_There"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.534779" elapsed="0.014424"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.549387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.549279" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.549260" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.550279" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.550174" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.550157" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.550619" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:27.550742" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:53:27.550493" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.551171" 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-04-25T23:53:27.550917" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.551600" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:27.551361" 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-04-25T23:53:27.552167" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:53:27.552584" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:53:27.552629" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.551812" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:27.553580" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.555730" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.555295" elapsed="0.000968">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.554036" elapsed="0.002307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:53:27.557960" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.556577" elapsed="0.001805"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:53:27.553076" elapsed="0.005405"/>
</kw>
<status status="PASS" start="2026-04-25T23:53:27.552856" elapsed="0.005707"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.552836" elapsed="0.005755"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:53:27.559545" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:53:27.559136" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:53:27.559619" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:53:27.559789" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:53:27.558813" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:53:27.559964" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.560857" level="INFO">index=32
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:53:27.560552" elapsed="0.000434"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:53:27.561134" elapsed="0.002298"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:53:27.563878" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:53:27.565056" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.563594" elapsed="0.001835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:53:27.575570" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:53:27.575962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:53:27.574271" elapsed="0.001779"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.576373" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.576630" 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-04-25T23:53:27.566244" elapsed="0.010698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:53:27.565716" elapsed="0.011273"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.549882" elapsed="0.027189">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.577406" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.577479" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.534074" elapsed="0.043509">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:53:27.577703" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:53:27.577747" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.529288" elapsed="0.048482"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.578095" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.577845" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:53:27.577827" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:53:27.529148" elapsed="0.049075"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:53:27.528978" elapsed="0.049275"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:53:27.526429" elapsed="0.051884"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:53:27.521106" elapsed="0.057262"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:53:27.520562" elapsed="0.057849"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:53:27.517511" elapsed="0.060990"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.580243" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:27.579865" 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-04-25T23:53:27.588082" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:27.587833" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:27.588545" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:27.588283" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:27.593444" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.590785" elapsed="0.006802">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:27.588658" elapsed="0.009170">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.598289" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.597914" elapsed="0.000563"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:27.588636" elapsed="0.009899">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.599484" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.599838" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:27.599748" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:27.599705" 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-04-25T23:53:27.600322" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.600486" 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-04-25T23:53:27.583293" elapsed="0.017488">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.600956" elapsed="0.000037"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.580505" elapsed="0.020680">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:27.601316" elapsed="0.000035"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.579586" elapsed="0.021948">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.602183" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.601744" elapsed="0.000579"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.602875" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.602379" elapsed="0.000692"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:27.603374" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:27.603131" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:27.601702" elapsed="0.001746"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:27.579195" elapsed="0.024335">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:28.607449" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:28.606442" 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-04-25T23:53:28.619564" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:28.619293" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:28.620031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:28.619783" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:28.625112" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:28.622318" elapsed="0.004493">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:28.620151" elapsed="0.006747">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:28.627092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:28.626937" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:28.620128" elapsed="0.007051">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:28.627554" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:28.627712" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:28.627657" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:28.627637" 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-04-25T23:53:28.627924" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:28.627991" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:28.614932" elapsed="0.013167">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:28.628169" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:28.608057" elapsed="0.020276">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:28.628390" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:28.605805" elapsed="0.022678">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:28.628719" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:28.628557" elapsed="0.000245"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:28.628985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:28.628825" elapsed="0.000215"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:28.629196" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:28.629063" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:28.628540" elapsed="0.000730"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:28.604609" elapsed="0.024740">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:29.633265" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:29.632236" 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-04-25T23:53:29.646182" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:29.645793" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:29.646708" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:29.646429" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:29.651690" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:29.648952" elapsed="0.004506">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:29.646831" elapsed="0.006715">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.653821" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:29.653595" elapsed="0.000299"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:29.646807" elapsed="0.007111">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.654302" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:29.654440" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:29.654400" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:29.654383" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.654658" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:29.654899" 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-04-25T23:53:29.639473" elapsed="0.015541">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:29.655087" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:29.633915" elapsed="0.021270">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:29.655242" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:29.631469" elapsed="0.023870">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.655568" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:29.655418" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.655823" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:29.655648" elapsed="0.000233"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:29.656041" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:29.655904" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:29.655400" elapsed="0.000718"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:29.630259" elapsed="0.025940">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:30.660256" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:30.659281" 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-04-25T23:53:30.671518" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:30.671237" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:30.671995" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:30.671744" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:30.676988" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:30.674225" elapsed="0.004514">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:30.672115" elapsed="0.006710">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:30.679013" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:30.678862" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:30.672092" elapsed="0.007009">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:30.679549" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:30.679703" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:30.679645" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:30.679628" 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-04-25T23:53:30.679911" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:30.679980" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:30.665409" elapsed="0.014679">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:30.680160" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:30.660963" elapsed="0.019293">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:30.680311" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:30.658579" elapsed="0.021827">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:30.680630" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:30.680483" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:30.680867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:30.680726" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:30.681082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:30.680945" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:30.680466" elapsed="0.000691"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:30.657360" elapsed="0.023876">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:31.684787" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:31.683777" 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-04-25T23:53:31.694882" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:31.694599" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:31.695331" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:31.695084" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:31.700253" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:31.697571" elapsed="0.004418">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:31.695452" elapsed="0.006622">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.702346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:31.702190" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:31.695429" elapsed="0.007013">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.702839" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:31.702989" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:31.702937" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:31.702919" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.703199" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:31.703270" 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-04-25T23:53:31.690252" elapsed="0.013126">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:31.703450" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:31.685351" elapsed="0.018195">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:31.703602" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:31.683118" elapsed="0.020864">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.704209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:31.704063" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.704429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:31.704289" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:31.704643" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:31.704506" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:31.704045" elapsed="0.000690"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:31.682046" elapsed="0.022794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:32.708313" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:32.707348" 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-04-25T23:53:32.719900" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:32.719616" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:32.720382" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:32.720106" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:32.725286" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:32.722703" elapsed="0.004336">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:32.720518" elapsed="0.006606">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.727313" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:32.727162" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:32.720494" elapsed="0.006907">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.727794" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:32.727930" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:32.727891" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:32.727874" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.728137" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:32.728206" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:32.713518" elapsed="0.014794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:32.728384" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:32.708905" elapsed="0.019579">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:32.728539" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:32.706692" elapsed="0.021939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.728868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:32.728723" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.729087" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:32.728947" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:32.729298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:32.729163" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:32.728705" elapsed="0.000667"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:32.705610" elapsed="0.023846">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:33.733106" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:33.732097" elapsed="0.001178"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:33.745604" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:33.745229" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:33.746075" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:33.745826" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:33.750982" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:33.748277" elapsed="0.004454">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:33.746197" elapsed="0.006620">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:33.753005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:33.752853" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:33.746173" elapsed="0.006921">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:33.753471" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:33.753606" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:33.753567" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:33.753550" 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-04-25T23:53:33.753833" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:33.753903" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:33.738908" elapsed="0.015102">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:33.754083" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:33.733806" elapsed="0.020372">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:33.754235" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:33.731442" elapsed="0.022885">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:33.754547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:33.754402" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:33.754783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:33.754624" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:33.754995" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:33.754860" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:33.754385" elapsed="0.000730"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:33.730359" elapsed="0.024834">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:34.758861" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:34.757863" 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-04-25T23:53:34.770112" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:34.769853" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:34.770562" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:34.770313" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:34.775722" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:34.772798" elapsed="0.004721">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:34.770700" elapsed="0.006905">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.777811" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:34.777640" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:34.770675" elapsed="0.007224">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.778267" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:34.778400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:34.778361" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:34.778345" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.778608" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:34.778693" 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-04-25T23:53:34.765429" elapsed="0.013371">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:34.778871" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:34.759445" elapsed="0.019519">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:34.779018" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:34.757147" elapsed="0.021961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.779381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:34.779236" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.779603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:34.779459" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:34.779834" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:34.779696" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:34.779219" elapsed="0.000687"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:34.756064" elapsed="0.023920">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:35.783684" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:35.782710" 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-04-25T23:53:35.794520" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:35.794260" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:35.794983" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:35.794737" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:35.800017" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:35.797188" elapsed="0.004596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:35.795104" elapsed="0.006767">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:35.802059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:35.801907" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:35.795080" elapsed="0.007070">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:35.802523" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:35.802676" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:35.802618" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:35.802601" 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-04-25T23:53:35.802887" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:35.802970" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:35.789568" elapsed="0.013507">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:35.803220" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:35.784240" elapsed="0.019079">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:35.803374" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:35.781989" elapsed="0.021477">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:35.803702" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:35.803541" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:35.803922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:35.803782" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:35.804133" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:35.803998" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:35.803524" elapsed="0.000682"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:35.780846" elapsed="0.023438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:36.807930" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:36.806964" 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-04-25T23:53:36.819131" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:36.818870" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:36.819571" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:36.819328" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:36.824564" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:36.821807" elapsed="0.004497">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:36.819708" elapsed="0.006682">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:36.826580" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:36.826427" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:36.819683" elapsed="0.007017">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:36.827074" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:36.827264" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:36.827221" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:36.827153" 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-04-25T23:53:36.827474" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:36.827544" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:36.814421" elapsed="0.013229">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:36.827743" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:36.808486" elapsed="0.019353">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:36.827895" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:36.806308" elapsed="0.021679">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:36.828208" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:36.828062" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:36.828426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:36.828286" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:36.828636" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:36.828502" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:36.828044" elapsed="0.000683"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:36.805209" elapsed="0.023596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:37.832405" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:37.831437" 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-04-25T23:53:37.842854" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:37.842575" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:37.843299" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:37.843054" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:37.848257" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:37.845506" elapsed="0.004550">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:37.843418" elapsed="0.006724">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.850328" elapsed="0.000134"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:37.850177" elapsed="0.000335"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:37.843395" elapsed="0.007141">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.850934" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:37.851069" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:37.851031" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:37.851014" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.851275" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:37.851345" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:37.836902" elapsed="0.014549">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:37.851522" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:37.833071" elapsed="0.018550">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:37.851693" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:37.830798" elapsed="0.020989">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.852007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:37.851862" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.852224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:37.852085" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:37.852432" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:37.852300" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:37.851845" elapsed="0.000661"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:37.829710" elapsed="0.022873">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:38.855741" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:38.854825" 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-04-25T23:53:38.865917" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:38.865648" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:38.866355" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:38.866113" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:38.871181" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:38.868534" elapsed="0.004388">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:38.866466" elapsed="0.006540">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.873189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:38.873040" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:38.866447" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.873684" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:38.873829" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:38.873792" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:38.873775" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.874032" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:38.874101" 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-04-25T23:53:38.860005" elapsed="0.014199">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:38.874275" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:38.856333" elapsed="0.018034">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:38.874422" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:38.854199" elapsed="0.020312">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.874747" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:38.874585" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.874965" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:38.874825" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:38.875172" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:38.875040" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:38.874568" elapsed="0.000677"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:38.853217" elapsed="0.022104">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:39.879105" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:39.878033" 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-04-25T23:53:39.891508" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:39.891235" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:39.892014" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:39.891764" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:39.896997" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:39.894232" elapsed="0.004533">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:39.892141" elapsed="0.006713">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:39.899047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:39.898893" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:39.892114" elapsed="0.007022">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:39.899511" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:39.899646" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:39.899607" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:39.899590" 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-04-25T23:53:39.899872" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:39.899941" 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-04-25T23:53:39.885813" elapsed="0.014234">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:39.900119" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:39.879693" elapsed="0.020520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:39.900268" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:39.877352" elapsed="0.023007">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:39.900576" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:39.900432" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:39.900811" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:39.900668" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:39.901020" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:39.900887" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:39.900416" elapsed="0.000677"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:39.876222" elapsed="0.024996">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:40.905326" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:40.904246" 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-04-25T23:53:40.919941" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:40.919637" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:40.920409" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:40.920157" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:40.925634" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:40.922766" elapsed="0.004629">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:40.920537" elapsed="0.006949">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.927697" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:40.927526" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:40.920510" elapsed="0.007280">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.928170" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:40.928318" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:40.928278" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:40.928259" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.928527" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:40.928596" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:40.915223" elapsed="0.013499">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:40.928796" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:40.906148" elapsed="0.022743">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:40.928945" elapsed="0.000046"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:40.903479" elapsed="0.025596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.929381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:40.929225" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.929603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:40.929463" elapsed="0.000210"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:40.929836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:40.929698" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:40.929206" elapsed="0.000706"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:40.902235" elapsed="0.027758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:41.933648" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:41.932695" 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-04-25T23:53:41.944668" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:41.944391" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:41.945116" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:41.944870" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:41.950139" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:41.947357" elapsed="0.004517">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:41.945240" elapsed="0.006728">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:41.952158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:41.952006" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:41.945213" elapsed="0.007034">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:41.952625" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:41.952805" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:41.952757" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:41.952736" 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-04-25T23:53:41.953017" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:41.953086" 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-04-25T23:53:41.938541" elapsed="0.014653">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:41.953264" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:41.934240" elapsed="0.019177">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:41.953473" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:41.932028" elapsed="0.021538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:41.953809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:41.953641" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:41.954026" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:41.953887" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:41.954237" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:41.954102" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:41.953624" elapsed="0.000686"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:41.930888" elapsed="0.023499">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:42.958137" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:42.957123" 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-04-25T23:53:42.970223" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:42.969958" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:42.970690" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:42.970425" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:42.975751" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:42.972922" elapsed="0.004585">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:42.970822" elapsed="0.006776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.977808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:42.977637" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:42.970793" elapsed="0.007104">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.978276" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:42.978411" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:42.978372" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:42.978355" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.978617" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:42.978775" 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-04-25T23:53:42.963782" elapsed="0.015105">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:42.978958" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:42.958736" elapsed="0.020316">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:42.979108" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:42.956405" elapsed="0.022795">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.979428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:42.979274" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.979670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:42.979510" elapsed="0.000216"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:42.979894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:42.979750" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:42.979258" elapsed="0.000713"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:42.955271" elapsed="0.024781">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:43.983457" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:43.982467" 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-04-25T23:53:43.995579" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:43.995217" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:43.996127" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:43.995880" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:44.001166" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:43.998327" elapsed="0.004555">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:43.996248" elapsed="0.006744">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.003184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:44.003032" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:43.996224" elapsed="0.007047">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.003718" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:44.003854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:44.003816" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:44.003798" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.004061" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:44.004130" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:43.989126" elapsed="0.015111">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:44.004309" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:43.984041" elapsed="0.020362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:44.004457" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:43.981854" elapsed="0.022694">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.004783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:44.004621" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.005000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:44.004862" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:44.005210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:44.005075" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:44.004604" elapsed="0.000680"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:43.980826" elapsed="0.024535">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:45.008884" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:45.007914" elapsed="0.001018"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:45.018697" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:45.018417" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:45.019147" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:45.018899" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:45.024210" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:45.021419" elapsed="0.004509">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:45.019267" elapsed="0.006805">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:45.026262" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:45.026110" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:45.019243" elapsed="0.007107">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:45.026747" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:45.026883" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:45.026843" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:45.026826" 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-04-25T23:53:45.027093" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:45.027162" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:45.012935" elapsed="0.014332">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:45.027337" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:45.009236" elapsed="0.018195">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:45.027484" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:45.007250" elapsed="0.020325">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:45.027809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:45.027648" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:45.028025" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:45.027886" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:45.028233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:45.028100" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:45.027631" elapsed="0.000674"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:45.006191" elapsed="0.022191">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:46.031552" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:46.030643" 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-04-25T23:53:46.043061" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:46.042805" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:46.043503" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:46.043260" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:46.048383" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:46.045751" elapsed="0.004263">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:46.043675" elapsed="0.006437">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.050297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:46.050147" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:46.043640" elapsed="0.006744">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.050770" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:46.050907" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:46.050870" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:46.050853" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.051115" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:46.051183" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:46.037821" elapsed="0.013465">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:46.051357" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:46.032119" elapsed="0.019330">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:46.051502" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:46.030038" elapsed="0.021554">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.051825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:46.051679" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.052045" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:46.051903" elapsed="0.000203"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:46.052260" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:46.052128" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:46.051649" elapsed="0.000684"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:46.029060" elapsed="0.023350">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:47.054111" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:47.053649" elapsed="0.000495"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:47.061703" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:47.061432" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:47.062156" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:47.061909" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:47.067096" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:47.064427" elapsed="0.004400">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:47.062272" elapsed="0.006640">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.069101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:47.068949" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:47.062251" elapsed="0.006938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.069565" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:47.069716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:47.069677" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:47.069643" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.069921" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:47.069998" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:47.057068" elapsed="0.013034">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:47.070172" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:47.054373" elapsed="0.015893">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:47.070321" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:47.053361" elapsed="0.017050">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.070630" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:47.070486" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.070862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:47.070724" elapsed="0.000241"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:47.071127" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:47.070989" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:47.070469" elapsed="0.000731"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:47.052873" elapsed="0.018405">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:48.074906" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:48.073923" 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-04-25T23:53:48.085954" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:48.085683" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:48.086399" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:48.086154" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:48.091427" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:48.088617" elapsed="0.004539">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:48.086520" elapsed="0.006747">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.093478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:48.093314" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:48.086496" elapsed="0.007070">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.093978" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:48.094117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:48.094077" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:48.094059" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.094324" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:48.094392" 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-04-25T23:53:48.079775" elapsed="0.014725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:48.094571" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:48.075461" elapsed="0.019222">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:48.094799" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:48.073254" elapsed="0.021646">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.095121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:48.094976" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.095336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:48.095199" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:48.095547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:48.095412" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:48.094959" elapsed="0.000660"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:48.072157" elapsed="0.023556">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:49.099513" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:49.098502" 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-04-25T23:53:49.111635" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:49.111358" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:49.112147" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:49.111860" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:49.117471" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:49.114455" elapsed="0.004825">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:49.112275" elapsed="0.007095">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.119582" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:49.119409" elapsed="0.000262"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:49.112249" elapsed="0.007449">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.120079" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:49.120244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:49.120204" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:49.120185" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.120455" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:49.120551" 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-04-25T23:53:49.106563" elapsed="0.014120">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:49.120822" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:49.100172" elapsed="0.020751">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:49.120979" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:49.097781" elapsed="0.023291">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.121333" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:49.121169" elapsed="0.000231"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.121587" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:49.121423" elapsed="0.000243"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:49.121865" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:49.121693" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:49.121147" elapsed="0.000798"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:49.096598" elapsed="0.025429">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:50.125809" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:50.124797" 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-04-25T23:53:50.136997" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:50.136727" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:50.137441" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:50.137195" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:50.142611" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:50.139761" elapsed="0.004596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:50.137563" elapsed="0.006881">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.144633" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:50.144481" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:50.137538" elapsed="0.007200">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.145115" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:50.145305" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:50.145265" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:50.145247" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.145512" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:50.145582" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:50.130787" elapsed="0.014918">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:50.145780" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:50.126400" elapsed="0.019476">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:50.145933" elapsed="0.000018"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:50.124106" elapsed="0.021921">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.146253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:50.146102" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.146471" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:50.146332" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:50.146696" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:50.146548" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:50.146085" elapsed="0.000686"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:50.122962" elapsed="0.023892">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:51.150504" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:51.149538" 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-04-25T23:53:51.161678" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:51.161401" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:51.162145" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:51.161877" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:51.167012" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:51.164358" elapsed="0.004362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:51.162264" elapsed="0.006542">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:51.168992" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:51.168842" elapsed="0.000272"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:51.162240" elapsed="0.006898">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:51.169517" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:51.169668" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:51.169613" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:51.169596" 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-04-25T23:53:51.169880" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:51.169950" 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-04-25T23:53:51.157045" elapsed="0.013015">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:51.170132" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:51.151092" elapsed="0.019134">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:51.170281" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:51.148888" elapsed="0.021484">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:51.170592" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:51.170447" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:51.170827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:51.170685" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:51.171038" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:51.170904" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:51.170430" elapsed="0.000681"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:51.147773" elapsed="0.023416">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:52.174697" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:52.173750" elapsed="0.001019"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:52.186377" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:52.186076" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:52.186881" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:52.186587" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:52.191885" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:52.189162" elapsed="0.005117">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:52.187013" elapsed="0.007359">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.194580" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:52.194411" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:52.186985" elapsed="0.007712">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.195113" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:52.195254" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:52.195214" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:52.195196" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.195462" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:52.195531" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:52.181005" elapsed="0.014636">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:52.195731" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:52.175245" elapsed="0.020583">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:52.195885" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:52.173108" elapsed="0.022869">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.196205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:52.196052" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.196442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:52.196298" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:52.196650" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:52.196517" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:52.196035" elapsed="0.000708"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:52.172037" elapsed="0.024785">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:53.200440" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:53.199451" 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-04-25T23:53:53.212819" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:53.212537" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:53.213272" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:53.213020" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:53.218041" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:53.215510" elapsed="0.004245">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:53.213393" elapsed="0.006447">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:53.220030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:53.219877" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:53.213370" elapsed="0.006749">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:53.220490" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:53.220625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:53.220587" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:53.220570" 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-04-25T23:53:53.220850" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:53.220920" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:53.208171" elapsed="0.012854">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:53.221097" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:53.201041" elapsed="0.020151">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:53.221248" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:53.198804" elapsed="0.022537">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:53.221560" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:53.221415" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:53.221828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:53.221639" elapsed="0.000245"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:53.222044" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:53.221907" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:53.221399" elapsed="0.000720"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:53.197702" elapsed="0.024529">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:54.225861" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:54.224902" 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-04-25T23:53:54.236433" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:54.236173" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:54.236893" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:54.236631" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:54.241714" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:54.239111" elapsed="0.004301">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:54.237013" elapsed="0.006485">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.243705" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:54.243535" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:54.236990" elapsed="0.006805">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.244170" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:54.244304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:54.244266" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:54.244249" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.244510" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:54.244580" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:54.230339" elapsed="0.014361">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:54.244774" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:54.226412" elapsed="0.018457">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:54.244924" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:54.224257" elapsed="0.020760">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.245289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:54.245142" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.245510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:54.245369" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:54.245738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:54.245587" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:54.245125" elapsed="0.000690"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:54.223244" elapsed="0.022650">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:55.249421" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:55.248475" elapsed="0.001015"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:55.265577" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:55.265122" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:55.266280" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:55.265918" 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-04-25T23:53:55.271996" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:55.269086" elapsed="0.004657">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:55.266454" elapsed="0.007386">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:55.274033" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:55.273879" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:55.266419" elapsed="0.007703">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:55.274508" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:55.274645" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:55.274605" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:55.274588" 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-04-25T23:53:55.274886" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:55.274958" 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-04-25T23:53:55.257821" elapsed="0.017256">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:55.275149" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:55.249996" elapsed="0.025315">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:55.275370" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:55.247856" elapsed="0.027644">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:55.275757" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:55.275582" elapsed="0.000235"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:55.275983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:55.275840" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:55.276203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:55.276062" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:55.275565" elapsed="0.000712"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:55.246765" elapsed="0.029595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:56.280137" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:56.279083" 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-04-25T23:53:56.292820" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:56.292530" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:56.293291" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:56.293037" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:56.298344" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:56.295538" elapsed="0.004531">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:56.293416" elapsed="0.006757">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:56.300400" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:56.300213" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:56.293392" elapsed="0.007099">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:56.300894" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:56.301033" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:56.300993" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:56.300976" 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-04-25T23:53:56.301255" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:56.301385" 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-04-25T23:53:56.286831" elapsed="0.014663">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:56.301566" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:56.280793" elapsed="0.020887">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:56.301740" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:56.278392" elapsed="0.023441">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:56.302059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:56.301909" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:56.302290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:56.302146" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:56.302503" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:56.302368" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:56.301892" elapsed="0.000684"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:56.277261" elapsed="0.025408">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:57.306315" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:57.305355" 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-04-25T23:53:57.318339" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:57.318069" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:57.318806" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:57.318540" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:57.323679" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:57.321048" elapsed="0.004335">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:57.318926" elapsed="0.006542">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.325669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:57.325503" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:57.318904" elapsed="0.006854">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.326198" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:57.326334" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:57.326294" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:57.326277" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.326541" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:57.326610" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:57.312732" elapsed="0.013999">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:57.326803" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:57.306899" elapsed="0.020000">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:57.326954" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:57.304596" elapsed="0.022450">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.327266" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:57.327120" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.327485" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:57.327343" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:57.327713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:57.327563" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:57.327102" elapsed="0.000687"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:57.303510" elapsed="0.024357">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:58.331427" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:58.330455" 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-04-25T23:53:58.343298" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:58.343036" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:58.343760" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:58.343496" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:58.348844" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:58.345997" elapsed="0.004553">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:58.343880" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.350902" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:58.350748" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:58.343856" elapsed="0.007134">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.351368" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:58.351503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:58.351464" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:58.351447" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.351728" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:58.351799" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:53:58.337902" elapsed="0.014003">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:58.351977" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:58.332015" elapsed="0.020057">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:58.352127" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:58.329796" elapsed="0.022424">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.352440" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:58.352295" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.352661" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:58.352518" elapsed="0.000211"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:58.352887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:58.352752" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:58.352278" elapsed="0.000684"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:58.328712" elapsed="0.024328">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:53:59.357113" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:53:59.356128" 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-04-25T23:53:59.369777" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:59.369349" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:53:59.370386" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:53:59.370060" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:53:59.375513" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:53:59.372794" elapsed="0.004431">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:53:59.370693" elapsed="0.006620">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.377502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:59.377350" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:53:59.370648" elapsed="0.006942">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.378014" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:59.378151" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:53:59.378112" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:59.378094" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.378357" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:53:59.378425" 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-04-25T23:53:59.363235" elapsed="0.015296">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:53:59.378603" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:53:59.357727" elapsed="0.020988">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:53:59.378772" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:53:59.355454" elapsed="0.023408">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.379080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:59.378935" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.379295" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:59.379157" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:53:59.379503" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:53:59.379369" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:53:59.378919" elapsed="0.000656"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:53:59.354350" elapsed="0.025304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:00.383329" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:00.382356" 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-04-25T23:54:00.395364" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:00.395080" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:00.395832" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:00.395564" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:00.400738" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:00.398039" elapsed="0.004375">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:00.395954" elapsed="0.006570">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.402739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:00.402563" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:00.395929" elapsed="0.006900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.403211" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:00.403349" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:00.403309" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:00.403291" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.403558" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:00.403629" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:00.389848" elapsed="0.013906">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:00.403828" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:00.383918" elapsed="0.020008">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:00.403982" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:00.381611" elapsed="0.022464">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.404315" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:00.404167" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.404534" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:00.404392" elapsed="0.000249"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:00.404837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:00.404681" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:00.404149" elapsed="0.000765"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:00.380550" elapsed="0.024444">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:01.407807" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:01.407150" elapsed="0.000704"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:01.416967" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:01.416703" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:01.417434" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:01.417182" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:01.422188" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:01.419632" elapsed="0.004266">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:01.417553" elapsed="0.006431">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.424172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:01.424020" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:01.417531" elapsed="0.006733">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.424633" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:01.424786" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:01.424747" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:01.424730" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.424992" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:01.425061" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:01.411839" elapsed="0.013341">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:01.425254" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:01.408165" elapsed="0.017185">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:01.425450" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:01.406733" elapsed="0.018813">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.425792" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:01.425628" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.426012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:01.425872" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:01.426224" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:01.426089" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:01.425610" elapsed="0.000705"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:01.405949" elapsed="0.020460">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:02.430054" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:02.429071" 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-04-25T23:54:02.442173" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:02.441878" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:02.442625" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:02.442377" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:02.447519" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:02.444863" elapsed="0.004358">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:02.442765" elapsed="0.006547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:02.449507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:02.449348" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:02.442743" elapsed="0.006854">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:02.449996" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:02.450150" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:02.450093" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:02.450076" 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-04-25T23:54:02.450356" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:02.450425" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:02.436402" elapsed="0.014129">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:02.450672" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:02.430607" elapsed="0.020167">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:02.450830" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:02.428414" elapsed="0.022508">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:02.451144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:02.450997" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:02.451368" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:02.451222" elapsed="0.000200"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:02.451583" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:02.451445" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:02.450981" elapsed="0.000692"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:02.427336" elapsed="0.024419">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:03.455478" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:03.454484" 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-04-25T23:54:03.466859" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:03.466577" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:03.467302" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:03.467058" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:03.472531" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:03.469541" elapsed="0.004834">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:03.467427" elapsed="0.007038">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.474681" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:03.474504" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:03.467401" elapsed="0.007381">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.475159" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:03.475357" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:03.475316" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:03.475292" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.475572" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:03.475643" elapsed="0.000050"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:03.462042" elapsed="0.013753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:03.475868" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:03.456076" elapsed="0.019889">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:03.476020" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:03.453838" elapsed="0.022275">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.476334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:03.476187" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.476553" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:03.476413" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:03.476798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:03.476630" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:03.476171" elapsed="0.000706"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:03.452638" elapsed="0.024318">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:04.480562" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:04.479593" 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-04-25T23:54:04.492672" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:04.492379" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:04.493115" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:04.492872" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:04.498143" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:04.495322" elapsed="0.004595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:04.493233" elapsed="0.006773">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.500195" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:04.500043" elapsed="0.000276"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:04.493210" elapsed="0.007133">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.500744" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:04.500879" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:04.500841" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:04.500824" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.501086" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:04.501155" 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-04-25T23:54:04.486176" elapsed="0.015087">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:04.501334" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:04.481151" elapsed="0.020277">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:04.501483" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:04.478909" elapsed="0.022671">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.501819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:04.501658" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.502038" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:04.501897" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:04.502249" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:04.502114" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:04.501638" elapsed="0.000685"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:04.477837" elapsed="0.024563">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:05.504842" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:05.504191" elapsed="0.000696"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:05.516601" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:05.516337" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:05.517061" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:05.516816" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:05.522024" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:05.519306" elapsed="0.004462">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:05.517179" elapsed="0.006674">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:05.524041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:05.523890" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:05.517156" elapsed="0.006973">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:05.524520" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:05.524656" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:05.524617" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:05.524599" 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-04-25T23:54:05.524882" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:05.524951" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:05.511363" elapsed="0.013694">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:05.525128" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:05.505196" elapsed="0.020027">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:05.525279" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:05.503784" elapsed="0.021586">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:05.525588" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:05.525445" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:05.525826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:05.525684" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:05.526038" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:05.525903" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:05.525428" elapsed="0.000683"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:05.503048" elapsed="0.023140">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:06.529840" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:06.528854" 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-04-25T23:54:06.541134" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:06.540871" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:06.541577" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:06.541331" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:06.546799" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:06.543831" elapsed="0.004689">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:06.541720" elapsed="0.006886">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:06.548822" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:06.548645" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:06.541693" elapsed="0.007217">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:06.549284" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:06.549418" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:06.549379" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:06.549362" 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-04-25T23:54:06.549631" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:06.549717" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:06.536486" elapsed="0.013339">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:06.549896" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:06.530395" elapsed="0.019594">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:06.550043" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:06.528182" elapsed="0.021951">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:06.550353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:06.550206" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:06.550569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:06.550430" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:06.550795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:06.550643" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:06.550190" elapsed="0.000678"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:06.527049" elapsed="0.023929">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:07.554462" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:07.553495" 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-04-25T23:54:07.564854" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:07.564570" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:07.565301" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:07.565054" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:07.570337" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:07.567531" elapsed="0.004523">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:07.565422" elapsed="0.006720">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.572329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:07.572178" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:07.565398" elapsed="0.007019">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.572810" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:07.572944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:07.572906" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:07.572889" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.573149" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:07.573217" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:07.560181" elapsed="0.013143">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:07.573395" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:07.555074" elapsed="0.018420">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:07.573548" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:07.552875" elapsed="0.020765">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.573934" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:07.573787" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.574151" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:07.574011" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:07.574360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:07.574227" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:07.573769" elapsed="0.000664"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:07.551811" elapsed="0.022706">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:08.577960" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:08.577011" elapsed="0.001019"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:08.589685" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:08.589407" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:08.590139" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:08.589892" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:08.595134" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:08.592348" elapsed="0.004522">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:08.590259" elapsed="0.006697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.597159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:08.596992" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:08.590237" elapsed="0.007011">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.597626" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:08.597777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:08.597740" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:08.597722" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.597984" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:08.598052" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:08.584329" elapsed="0.013829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:08.598229" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:08.578508" elapsed="0.019867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:08.598432" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:08.576329" elapsed="0.022199">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.598771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:08.598605" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.598992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:08.598852" elapsed="0.000195"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:08.599205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:08.599070" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:08.598588" elapsed="0.000692"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:08.575288" elapsed="0.024070">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:09.602523" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:09.601585" elapsed="0.001002"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:09.614548" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:09.614154" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:09.615112" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:09.614864" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:09.619892" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:09.617310" elapsed="0.004196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:09.615226" elapsed="0.006362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:09.621801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:09.621623" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:09.615207" elapsed="0.006682">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:09.622255" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:09.622417" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:09.622378" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:09.622333" 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-04-25T23:54:09.622627" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:09.622750" 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-04-25T23:54:09.607926" elapsed="0.014931">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:09.622929" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:09.603087" elapsed="0.019938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:09.623081" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:09.600986" elapsed="0.022188">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:09.623395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:09.623249" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:09.623621" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:09.623474" elapsed="0.000219"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:09.623855" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:09.623716" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:09.623232" elapsed="0.000697"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:09.600047" elapsed="0.023960">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:10.626011" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:10.625525" 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-04-25T23:54:10.633774" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:10.633495" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:10.634226" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:10.633974" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:10.639413" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:10.636450" elapsed="0.004671">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:10.634348" elapsed="0.006858">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.641395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:10.641243" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:10.634324" elapsed="0.007159">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.641941" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:10.642078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:10.642039" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:10.642021" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.642284" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:10.642359" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:10.628994" elapsed="0.013472">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:10.642544" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:10.626272" elapsed="0.016369">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:10.642715" elapsed="0.000017"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:10.625202" elapsed="0.017615">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.643039" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:10.642893" elapsed="0.000228"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.643286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:10.643144" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:10.643497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:10.643363" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:10.642875" elapsed="0.000696"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:10.624598" elapsed="0.019052">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:11.645450" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:11.645009" elapsed="0.000475"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:11.653105" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:11.652843" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:11.653555" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:11.653307" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:11.658722" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:11.655907" elapsed="0.004493">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:11.653697" elapsed="0.006845">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.660751" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:11.660579" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:11.653673" elapsed="0.007169">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.661218" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:11.661353" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:11.661315" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:11.661298" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.661563" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:11.661633" 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-04-25T23:54:11.648418" elapsed="0.013343">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:11.661834" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:11.645723" elapsed="0.016208">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:11.661987" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:11.644714" elapsed="0.017365">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.662317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:11.662170" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.662537" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:11.662396" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:11.662767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:11.662613" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:11.662153" elapsed="0.000688"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:11.644168" elapsed="0.018752">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:12.666022" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:12.665113" elapsed="0.000972"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:12.678489" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:12.678139" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:12.679161" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:12.678786" 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-04-25T23:54:12.684103" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:12.681521" elapsed="0.004252">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:12.679370" elapsed="0.006485">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:12.686042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:12.685891" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:12.679343" elapsed="0.006787">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:12.686498" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:12.686630" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:12.686593" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:12.686576" 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-04-25T23:54:12.686859" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:12.686930" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:12.672049" elapsed="0.015015">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:12.687137" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:12.666554" elapsed="0.020677">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:12.687286" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:12.664478" elapsed="0.022900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:12.687605" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:12.687452" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:12.687859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:12.687715" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:12.688072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:12.687937" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:12.687435" elapsed="0.000712"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:12.663544" elapsed="0.024681">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:13.692149" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:13.691054" 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-04-25T23:54:13.703778" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:13.703492" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:13.704228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:13.703979" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:13.709208" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:13.706481" elapsed="0.004538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:13.704355" elapsed="0.006755">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.711304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:13.711150" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:13.704327" elapsed="0.007065">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.711801" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:13.711938" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:13.711898" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:13.711881" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.712149" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:13.712217" 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-04-25T23:54:13.697552" elapsed="0.014775">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:13.712398" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:13.692775" elapsed="0.019717">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:13.712546" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:13.690331" elapsed="0.022311">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.712883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:13.712737" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.713102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:13.712961" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:13.713399" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:13.713248" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:13.712719" elapsed="0.000776"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:13.689153" elapsed="0.024424">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:14.717048" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:14.716074" 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-04-25T23:54:14.729772" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:14.729380" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:14.730223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:14.729975" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:14.735296" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:14.732427" elapsed="0.004584">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:14.730345" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.737311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:14.737136" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:14.730321" elapsed="0.007081">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.737802" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:14.737939" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:14.737901" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:14.737884" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.738144" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:14.738213" 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-04-25T23:54:14.723173" elapsed="0.015146">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:14.738389" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:14.717621" elapsed="0.020871">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:14.738600" elapsed="0.000017"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:14.715392" elapsed="0.023325">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.738945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:14.738794" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.739162" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:14.739023" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:14.739373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:14.739238" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:14.738777" elapsed="0.000669"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:14.714324" elapsed="0.025199">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:15.743156" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:15.742162" 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-04-25T23:54:15.754175" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:15.753914" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:15.754625" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:15.754376" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:15.760115" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:15.756868" elapsed="0.005066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:15.754766" elapsed="0.007261">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.762237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:15.762068" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:15.754741" elapsed="0.007584">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.762757" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:15.762899" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:15.762860" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:15.762843" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.763106" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:15.763174" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:15.748227" elapsed="0.015055">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:15.763415" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:15.743743" elapsed="0.019769">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:15.763566" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:15.741483" elapsed="0.022193">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.764077" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:15.763751" elapsed="0.000384"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.764299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:15.764158" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:15.764510" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:15.764374" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:15.763735" elapsed="0.000848"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:15.740376" elapsed="0.024300">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:16.768316" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:16.767348" 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-04-25T23:54:16.779509" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:16.779247" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:16.779971" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:16.779725" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:16.785060" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:16.782189" elapsed="0.004657">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:16.780092" elapsed="0.006841">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.787122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:16.786968" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:16.780069" elapsed="0.007140">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.787574" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:16.787788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:16.787748" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:16.787729" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.787996" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:16.788066" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:16.773249" elapsed="0.014926">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:16.788246" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:16.768909" elapsed="0.019431">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:16.788393" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:16.766720" elapsed="0.021763">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.788718" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:16.788557" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.788937" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:16.788799" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:16.789146" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:16.789012" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:16.788541" elapsed="0.000677"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:16.765566" elapsed="0.023729">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:17.792871" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:17.791885" 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-04-25T23:54:17.806567" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:17.806303" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:17.807032" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:17.806784" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:17.812386" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:17.809249" elapsed="0.004855">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:17.807151" elapsed="0.007039">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.814382" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:17.814226" elapsed="0.000278"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:17.807129" elapsed="0.007399">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.814932" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:17.815067" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:17.815028" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:17.815010" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.815271" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:17.815341" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:17.801961" elapsed="0.013487">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:17.815520" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:17.793427" elapsed="0.022188">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:17.815690" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:17.791231" elapsed="0.024554">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.816005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:17.815860" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.816222" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:17.816083" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:17.816432" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:17.816298" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:17.815843" elapsed="0.000688"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:17.790151" elapsed="0.026459">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:18.820337" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:18.819315" 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-04-25T23:54:18.833866" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:18.833582" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:18.834312" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:18.834067" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:18.839306" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:18.836564" elapsed="0.004500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:18.834446" elapsed="0.006704">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.841341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:18.841187" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:18.834423" elapsed="0.007006">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.841824" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:18.841961" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:18.841921" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:18.841904" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.842167" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:18.842237" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:18.827085" elapsed="0.015259">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:18.842429" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:18.821023" elapsed="0.021503">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:18.842583" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:18.818625" elapsed="0.024066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.842916" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:18.842769" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.843134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:18.842993" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:18.843345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:18.843210" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:18.842752" elapsed="0.000667"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:18.817449" elapsed="0.026048">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:19.847181" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:19.846196" 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-04-25T23:54:19.858006" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:19.857732" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:19.858467" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:19.858211" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:19.863511" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:19.860760" elapsed="0.004514">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:19.858593" elapsed="0.006776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.865567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:19.865410" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:19.858567" elapsed="0.007106">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.866059" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:19.866196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:19.866157" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:19.866140" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.866416" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:19.866490" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:19.853296" elapsed="0.013303">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:19.866689" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:19.847776" elapsed="0.019012">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:19.866844" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:19.845509" elapsed="0.021430">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.867164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:19.867015" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.867394" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:19.867245" elapsed="0.000207"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:19.867615" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:19.867476" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:19.866997" elapsed="0.000714"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:19.844403" elapsed="0.023432">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:20.871630" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:20.870622" 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-04-25T23:54:20.884516" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:20.884251" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:20.884991" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:20.884736" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:20.890082" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:20.887275" elapsed="0.004598">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:20.885127" elapsed="0.006837">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.892174" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:20.892002" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:20.885103" elapsed="0.007164">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.892684" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:20.892825" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:20.892786" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:20.892768" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.893033" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:20.893102" 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-04-25T23:54:20.878401" elapsed="0.014819">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:20.893296" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:20.872255" elapsed="0.021138">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:20.893450" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:20.869967" elapsed="0.023579">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.893895" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:20.893696" elapsed="0.000260"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.894125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:20.893981" elapsed="0.000217"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:20.894373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:20.894227" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:20.893676" elapsed="0.000773"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:20.868773" elapsed="0.025758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:21.898134" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:21.897166" 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-04-25T23:54:21.908949" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:21.908679" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:21.909401" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:21.909152" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:21.914351" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:21.911635" elapsed="0.004436">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:21.909521" elapsed="0.006637">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.916349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:21.916194" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:21.909498" elapsed="0.006939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.916855" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:21.916993" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:21.916952" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:21.916935" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.917202" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:21.917271" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:21.902843" elapsed="0.014536">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:21.917457" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:21.898717" elapsed="0.018956">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:21.917733" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:21.896498" elapsed="0.021329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.918053" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:21.917903" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.918276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:21.918133" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:21.918493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:21.918355" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:21.917886" elapsed="0.000682"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:21.895386" elapsed="0.023261">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:22.922350" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:22.921363" 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-04-25T23:54:22.933872" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:22.933587" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:22.934318" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:22.934072" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:22.939338" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:22.936521" elapsed="0.004622">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:22.934445" elapsed="0.006788">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.941439" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:22.941271" elapsed="0.000264"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:22.934418" elapsed="0.007143">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.941979" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:22.942115" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:22.942076" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:22.942059" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.942322" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:22.942457" 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-04-25T23:54:22.927609" elapsed="0.014962">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:22.942642" elapsed="0.000032"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:22.922965" elapsed="0.019794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:22.942816" elapsed="0.000018"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:22.920710" elapsed="0.022220">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.943155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:22.943007" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.943373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:22.943233" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:22.943585" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:22.943449" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:22.942991" elapsed="0.000680"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:22.919547" elapsed="0.024205">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:23.947293" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:23.946335" 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-04-25T23:54:23.960929" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:23.960539" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:23.961553" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:23.961210" 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-04-25T23:54:23.968134" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:23.964694" elapsed="0.005845">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:23.961740" elapsed="0.008938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.970924" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:23.970731" elapsed="0.000257"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:23.961708" elapsed="0.009304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.971452" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:23.971590" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:23.971550" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:23.971533" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.971822" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:23.971894" 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-04-25T23:54:23.954242" elapsed="0.017762">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:23.972076" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:23.947933" elapsed="0.024239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:23.972227" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:23.945628" elapsed="0.026691">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.972539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:23.972394" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.972817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:23.972617" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:23.973032" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:23.972896" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:23.972377" elapsed="0.000728"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:23.944578" elapsed="0.028605">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:24.976491" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:24.975543" 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-04-25T23:54:24.988267" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:24.987998" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:24.988735" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:24.988469" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:24.993835" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:24.990965" elapsed="0.004626">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:24.988853" elapsed="0.006889">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.995934" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:24.995780" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:24.988832" elapsed="0.007193">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.996403" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:24.996538" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:24.996499" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:24.996482" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.996808" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:24.996897" 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-04-25T23:54:24.981863" elapsed="0.015171">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:24.997119" elapsed="0.000019"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:24.977071" elapsed="0.020163">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:24.997299" elapsed="0.000018"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:24.974912" elapsed="0.022504">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.997715" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:24.997506" elapsed="0.000289"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.998001" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:24.997824" elapsed="0.000242"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:24.998255" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:24.998092" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:24.997486" elapsed="0.000855"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:24.973928" elapsed="0.024508">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:26.002016" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:26.001058" 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-04-25T23:54:26.015370" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:26.015006" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:26.016022" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:26.015671" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:26.022550" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:26.019223" elapsed="0.005066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:26.016278" elapsed="0.008098">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.024563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:26.024411" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:26.016246" elapsed="0.008404">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.025047" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:26.025183" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:26.025144" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:26.025127" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.025387" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:26.025457" 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-04-25T23:54:26.008518" elapsed="0.017043">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:26.025633" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:26.002568" elapsed="0.023177">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:26.025801" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:26.000356" elapsed="0.025538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.026119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:26.025973" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.026338" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:26.026198" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:26.026548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:26.026414" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:26.025957" elapsed="0.000665"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:25.999296" elapsed="0.027420">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:27.030892" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:27.029813" 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-04-25T23:54:27.045988" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:27.045594" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:27.046609" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:27.046266" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:27.053206" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:27.049740" elapsed="0.005405">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:27.046804" elapsed="0.008430">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:27.055427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:27.055273" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:27.046769" elapsed="0.008745">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:27.055914" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:27.056056" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:27.056016" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:27.055996" 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-04-25T23:54:27.056267" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:27.056336" 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-04-25T23:54:27.037812" elapsed="0.018632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:27.056515" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:27.031476" elapsed="0.025132">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:27.056676" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:27.029004" elapsed="0.027766">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:27.057000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:27.056851" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:27.057243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:27.057097" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:27.057516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:27.057378" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:27.056834" elapsed="0.000756"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:27.027769" elapsed="0.029915">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.061353" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.060372" 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-04-25T23:54:28.072333" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.072067" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.072812" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.072539" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:28.077717" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.075036" elapsed="0.004407">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.072936" elapsed="0.006595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.079736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.079568" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.072911" elapsed="0.006914">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.080196" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.080331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.080292" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.080275" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.080536" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.080604" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.067609" elapsed="0.013117">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.080799" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.062021" elapsed="0.018871">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.081000" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.059733" elapsed="0.021362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.081313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.081169" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.081528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.081390" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.081753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.081604" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.081152" elapsed="0.000676"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:54:28.058584" elapsed="0.023321">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:54:28.082008" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_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>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.578685" elapsed="60.503440">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:53:27.516919" elapsed="60.565408">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t16" name="Modify_Device_Data_Again" line="144">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:28.085943" elapsed="0.000572"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:28.085682" elapsed="0.000889"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.087626" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.087514" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.087496" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.092887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.092781" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.092764" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.093952" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.093549" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.094456" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:28.094160" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:28.094526" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:28.094699" 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-04-25T23:54:28.093179" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.100288" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.100181" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.100159" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.101616" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.101508" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.101490" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.102245" 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-04-25T23:54:28.101851" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.102697" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.102430" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.105672" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.105370" elapsed="0.001213">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.106781" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:28.106827" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.102882" elapsed="0.003970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.107702" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.107410" elapsed="0.001327">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.108916" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:28.108962" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.107020" elapsed="0.001965"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.109903" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.109280" elapsed="0.000702">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.109061" elapsed="0.001040">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.109041" elapsed="0.001096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.110295" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.110522" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.110382" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.110364" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.110665" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.113676" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:54:28.113899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.112997" elapsed="0.000995"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.115061" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.116024" elapsed="0.000043"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.111520" elapsed="0.004642"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.110938" elapsed="0.005340"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.101173" elapsed="0.015190">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</status>
</kw>
<msg time="2026-04-25T23:54:28.116465" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.116507" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Again"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.100502" elapsed="0.016028"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.116729" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.116607" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.116588" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.117617" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.117513" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.117495" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.117984" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.118137" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.117848" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.118591" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.118322" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.119092" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.118829" 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-04-25T23:54:28.119765" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:54:28.120179" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:28.120225" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.119313" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.121066" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.123370" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.122796" elapsed="0.001135">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.121455" elapsed="0.002556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.125482" elapsed="0.000373"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.124248" elapsed="0.001671"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.120541" elapsed="0.005480"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.120324" elapsed="0.005777"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.120305" elapsed="0.005823"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.127160" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.126755" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:28.127235" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.127388" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.126334" elapsed="0.001079"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.127564" elapsed="0.000435"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.128275" level="INFO">index=33
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.128170" elapsed="0.000230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.128544" elapsed="0.002358"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.131361" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:28.132414" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.131090" elapsed="0.001706">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.143167" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:54:28.143539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.141691" elapsed="0.001937"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.144017" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.144276" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.133574" elapsed="0.010842"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.133066" elapsed="0.011398"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.117186" elapsed="0.027360">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.144935" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.145010" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.099803" elapsed="0.045311">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:28.145217" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.145261" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.095111" elapsed="0.050173"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.145608" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.145360" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.145342" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:28.094968" elapsed="0.050756"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:28.094786" elapsed="0.050969"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:28.092407" elapsed="0.053403"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:28.087226" elapsed="0.058639"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.086750" elapsed="0.059160"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:28.083334" elapsed="0.062627"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.146580" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:28.146150" elapsed="0.000457"/>
</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-04-25T23:54:28.181260" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.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-04-25T23:54:28.180886" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.182052" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.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-04-25T23:54:28.181795" elapsed="0.000340">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.182230" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.181451" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.182814" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.182414" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.183137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.183293" 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-04-25T23:54:28.183000" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.183764" 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-04-25T23:54:28.183504" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.184764" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.184489" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.185233" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.184966" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.185926" 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-04-25T23:54:28.185608" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.186735" 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-04-25T23:54:28.186463" elapsed="0.000299"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.186812" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:28.186963" 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-04-25T23:54:28.186146" 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-04-25T23:54:28.187136" elapsed="0.000223"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:28.185477" elapsed="0.001923"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.187964" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:28.187642" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.188876" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.188623" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.188952" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.189103" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:28.188169" 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-04-25T23:54:28.189413" elapsed="0.000219"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:28.187512" elapsed="0.002175"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.185307" elapsed="0.004416"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.189764" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:28.189919" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:28.184169" elapsed="0.005775"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.183877" elapsed="0.006098"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.190169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.189999" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.183858" elapsed="0.006388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.190984" level="INFO">${final_text} = /restconf/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-04-25T23:54:28.190385" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.191060" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.180261" elapsed="0.010922"/>
</kw>
<msg time="2026-04-25T23:54:28.191236" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.167366" elapsed="0.023917"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.203826" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.216471" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.229326" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.229529" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.229722" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.230201" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.229953" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.229938" elapsed="0.000359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.230445" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.230611" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.230794" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.229910" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.229804" elapsed="0.001069"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.231024" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.231104" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:54:28.231229" level="INFO">${uri} = /restconf/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-04-25T23:54:28.162959" elapsed="0.068296"/>
</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-04-25T23:54:28.258624" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.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-04-25T23:54:28.258227" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.259450" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.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-04-25T23:54:28.259186" elapsed="0.000345">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.259626" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.258842" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.260255" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/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-04-25T23:54:28.259831" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.260585" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.260844" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:54:28.260441" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.261274" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:54:28.261027" 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-04-25T23:54:28.261722" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.261398" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.262260" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.261953" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.261809" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.261374" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.262962" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:54:28.262488" elapsed="0.000506"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.263047" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.257577" elapsed="0.005605"/>
</kw>
<msg time="2026-04-25T23:54:28.263236" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.244638" elapsed="0.018644"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.276175" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.288939" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.301335" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.301526" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.301711" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.302088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.301946" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.301932" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.302315" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.302480" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.302694" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.301903" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.301794" elapsed="0.000983"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.302920" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.302995" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:54:28.303113" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:54:28.241821" elapsed="0.061320"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.304409" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.304159" elapsed="0.000314">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.304565" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.303818" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.304929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.304683" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.305478" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.305187" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.305010" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.304641" elapsed="0.000920"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.307993" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.305726" elapsed="0.002300"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:28.308090" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:54:28.308262" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:28.303472" elapsed="0.004815"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.309673" level="INFO">/restconf/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-04-25T23:54:28.309415" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.310113" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:54:28.309872" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.310569" 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-04-25T23:54:28.310327" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.311028" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.310773" elapsed="0.000307"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.311905" 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-04-25T23:54:28.311699" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:28.312298" 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-04-25T23:54:28.312108" elapsed="0.000215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.312468" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.313124" 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-04-25T23:54:28.312848" elapsed="0.000321"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:28.313212" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.313366" 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-04-25T23:54:28.311286" elapsed="0.002104"/>
</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-04-25T23:54:28.318644" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.315869" elapsed="0.004461">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.313499" elapsed="0.006920">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.320603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.320453" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.313480" elapsed="0.007233">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.321087" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.321215" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.321179" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.321162" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.321417" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.321482" 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-04-25T23:54:28.308617" elapsed="0.012970">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.321675" 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-04-25T23:54:28.151922" elapsed="0.169852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.322057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.321882" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.321866" elapsed="0.000279"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.322177" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}datamod2</arg>
<arg>${mapping}</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-04-25T23:54:28.147226" elapsed="0.175075">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.082721" elapsed="0.239743">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t17" name="Check_Device_Data_Is_Modified_Again" line="149">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:28.325893" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:28.325614" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.327209" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.327093" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.327070" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.332422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.332316" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.332298" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.333477" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.333097" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.333973" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:28.333676" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:28.334044" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.334197" 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-04-25T23:54:28.332724" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.339699" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.339577" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.339558" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.341041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.340934" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.340916" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.341608" 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-04-25T23:54:28.341248" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.342058" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.341808" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.342930" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.342637" elapsed="0.001184">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.344003" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:28.344049" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.342251" elapsed="0.001821"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.344922" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.344626" elapsed="0.001329">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.346129" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:28.346175" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.344238" elapsed="0.001960"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.347134" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.346515" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.346296" elapsed="0.001008">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.346275" elapsed="0.001207">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.347641" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.347918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.347744" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.347727" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.348050" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.351027" elapsed="0.000146"/>
</kw>
<msg time="2026-04-25T23:54:28.351246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.350402" elapsed="0.000938"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.352269" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.353289" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.348906" elapsed="0.004502"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.348311" elapsed="0.005212"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.340560" elapsed="0.013048">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</status>
</kw>
<msg time="2026-04-25T23:54:28.353827" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.353871" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Modified_Again"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.339914" elapsed="0.013981"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.354080" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.353973" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.353954" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.354975" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.354864" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.354846" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.355343" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.355445" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.355220" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.355894" level="INFO">{1: 33}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.355620" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.356325" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.356087" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.356934" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:54:28.357351" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:28.357398" level="INFO">${old_connection_index} = 33</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.356521" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.358355" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.360602" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.360174" elapsed="0.000988">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.358765" elapsed="0.002474"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.362885" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.361475" elapsed="0.001836"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.357833" elapsed="0.005578"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.357494" elapsed="0.005969"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.357476" elapsed="0.006046"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.364481" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.364071" elapsed="0.000437"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:28.364556" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.364725" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.363745" elapsed="0.001005"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.364903" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.365596" level="INFO">index=34
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.365489" elapsed="0.000264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.365901" elapsed="0.002518"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.368860" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:28.369938" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.368582" elapsed="0.001746">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.380889" elapsed="0.000310"/>
</kw>
<msg time="2026-04-25T23:54:28.381257" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.379443" elapsed="0.001901"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.381686" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.381944" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.371150" elapsed="0.010934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.370597" elapsed="0.011534"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.354550" elapsed="0.027661">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.382570" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.382643" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.339240" elapsed="0.043526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:28.382870" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.382913" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.334602" elapsed="0.048334"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.383260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.383016" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.382996" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:28.334464" elapsed="0.048894"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:28.334288" elapsed="0.049101"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:28.331955" elapsed="0.051489"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:28.326776" elapsed="0.056722"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.326335" elapsed="0.057207"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:28.323412" elapsed="0.060235"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.385176" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.384785" 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-04-25T23:54:28.392820" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.392552" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.393296" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.393024" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:28.397914" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.395500" elapsed="0.004078">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.393405" elapsed="0.006277">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.399868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.399717" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.393386" elapsed="0.006568">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.400322" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.400453" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.400417" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.400400" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.400669" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.400741" 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-04-25T23:54:28.387861" elapsed="0.012983">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.400914" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.385411" elapsed="0.015596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.401066" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.384509" elapsed="0.016647">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.401375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.401229" elapsed="0.000234"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.401633" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.401488" elapsed="0.000215"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.401865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.401726" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.401213" elapsed="0.000731"/>
</if>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<status status="FAIL" start="2026-04-25T23:54:28.384124" elapsed="0.017904">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.322852" elapsed="0.079322">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t18" name="Modify_Device_Data_Label_Via_Json" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:28.405579" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:28.405320" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.406882" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.406770" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.406751" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.412304" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.412198" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.412181" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.413368" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.412986" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.413865" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:28.413553" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:28.413935" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.414090" 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-04-25T23:54:28.412593" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.419682" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.419560" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.419542" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.420963" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.420854" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.420836" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.421533" 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-04-25T23:54:28.421174" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.421983" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.421736" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.422907" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.422611" elapsed="0.001200">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.424005" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:28.424060" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.422163" elapsed="0.001925"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.424942" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.424666" elapsed="0.001354">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.426195" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:28.426241" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.424264" elapsed="0.001999"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.427447" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.426589" elapsed="0.000941">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.426364" elapsed="0.001264">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.426339" elapsed="0.001341">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.427861" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.428092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.427952" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.427934" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.428222" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.431567" elapsed="0.000188"/>
</kw>
<msg time="2026-04-25T23:54:28.431848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.430876" elapsed="0.001097"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.433151" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.434363" elapsed="0.000046"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.429129" elapsed="0.005370"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.428497" elapsed="0.006116"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.420526" elapsed="0.014217">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</status>
</kw>
<msg time="2026-04-25T23:54:28.434848" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.434892" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Modify_Device_Data_Label_Via_Json"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.419897" elapsed="0.015019"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.435135" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.435002" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.434978" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.436085" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.435981" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.435963" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.436438" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.436562" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.436306" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.437047" 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-04-25T23:54:28.436785" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.437482" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.437242" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.438212" elapsed="0.000383"/>
</kw>
<msg time="2026-04-25T23:54:28.438711" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:28.438757" 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-04-25T23:54:28.437839" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.439686" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.442001" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.441380" elapsed="0.001257">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.440112" elapsed="0.002622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.444206" elapsed="0.000382"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.442967" elapsed="0.001926"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.439163" elapsed="0.005845"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.438908" elapsed="0.006151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.438888" elapsed="0.006220"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.446137" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.445691" elapsed="0.000472"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:28.446213" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:54:28.446414" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.445331" elapsed="0.001110"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.446611" elapsed="0.000569"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.449602" level="INFO">index=35
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.447350" elapsed="0.002398"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.449900" elapsed="0.002449"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.452823" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:28.453838" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.452511" elapsed="0.001702">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.464865" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:54:28.465240" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.463294" 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-04-25T23:54:28.465963" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.466233" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.455108" elapsed="0.011286"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.454553" elapsed="0.011895"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.435611" elapsed="0.030921">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.466892" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.466966" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.419225" elapsed="0.047845">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:28.467219" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.467262" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.414552" elapsed="0.052732"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.467613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.467362" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.467343" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:28.414389" elapsed="0.053339"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:28.414172" elapsed="0.053590"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:28.411836" elapsed="0.055981"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:28.406464" elapsed="0.061406"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.406018" elapsed="0.061895"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:28.403124" elapsed="0.064840"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.468570" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:28.468140" elapsed="0.000456"/>
</kw>
<kw name="Put_As_Json_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-04-25T23:54:28.548913" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.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-04-25T23:54:28.548409" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.549807" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.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-04-25T23:54:28.549508" elapsed="0.000401">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.550010" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.549129" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.550628" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.550214" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.551004" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.551180" 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-04-25T23:54:28.550836" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.551639" 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-04-25T23:54:28.551387" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.552786" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.552506" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.553310" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.553008" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.554057" 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-04-25T23:54:28.553724" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.554961" 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-04-25T23:54:28.554645" elapsed="0.000346"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.555093" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:28.555260" 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-04-25T23:54:28.554287" elapsed="0.001014"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.555462" elapsed="0.000269"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:28.553573" elapsed="0.002200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.556374" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:28.556038" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.557185" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.556924" elapsed="0.000287"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.557261" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:28.557444" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:28.556586" elapsed="0.000883"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.557619" elapsed="0.000240"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:28.555885" elapsed="0.002016"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.553393" elapsed="0.004553"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.558020" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:54:28.558242" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:28.552156" elapsed="0.006116"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.551786" elapsed="0.006523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.558515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.558342" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.551758" elapsed="0.006835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.559458" level="INFO">${final_text} = /restconf/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-04-25T23:54:28.558759" elapsed="0.000727"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.559536" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.547530" elapsed="0.012145"/>
</kw>
<msg time="2026-04-25T23:54:28.559732" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.492115" elapsed="0.067665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.572871" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.585420" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.597964" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.598203" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.598375" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.598774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.598616" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.598601" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.598990" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.599152" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.599313" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.598573" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.598453" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.599532" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.599606" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:28.599745" level="INFO">${uri} = /restconf/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-04-25T23:54:28.487849" elapsed="0.111923"/>
</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-04-25T23:54:28.626020" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.625625" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.626805" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.626558" elapsed="0.000320">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.626971" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.626207" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.627535" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.627153" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.627872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.628029" level="INFO">${template} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:28.627734" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.628447" level="INFO">{
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.628205" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:54:28.628871" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.628558" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.629458" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.629116" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.628954" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.628539" elapsed="0.001004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.630243" level="INFO">${final_text} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:28.629720" elapsed="0.000595"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.630375" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.625016" elapsed="0.005522"/>
</kw>
<msg time="2026-04-25T23:54:28.630602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.612469" elapsed="0.018213"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.643551" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.656354" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.668995" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.669202" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.669374" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.669786" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.669622" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.669605" elapsed="0.000263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.670007" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.670176" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.670338" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.669572" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.669456" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.670573" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.670649" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.670791" level="INFO">${data} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</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-04-25T23:54:28.609813" elapsed="0.061005"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.672291" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.671957" elapsed="0.000411">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.672463" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.671566" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.672832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.672558" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.673387" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.673094" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.672913" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.672539" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.675841" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.673618" elapsed="0.002250"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:28.675919" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.676072" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:28.671219" elapsed="0.004878"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.677693" level="INFO">/restconf/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-04-25T23:54:28.677374" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.678170" level="INFO">{
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.677905" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.678642" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.678366" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.679088" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.678851" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.679948" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:54:28.679743" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:28.680295" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:54:28.680123" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.680465" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.681085" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.680833" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:28.681171" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.681326" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.679327" elapsed="0.002023"/>
</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-04-25T23:54:28.686495" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.683682" elapsed="0.004507">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.681419" elapsed="0.006859">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.688460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.688311" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.681402" elapsed="0.007181">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:28.688970" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.689102" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.689066" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.689049" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.689302" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.689367" 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-04-25T23:54:28.676441" elapsed="0.013029">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.689545" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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-04-25T23:54:28.476916" elapsed="0.212722">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.689939" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.689763" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.689745" elapsed="0.000283"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.690059" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}datamodjson</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Put_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.472561" elapsed="0.217594">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a JSON request to change the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.402507" elapsed="0.287807">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t19" name="Check_Device_Data_Label_Is_Modified_Via_Json" line="161">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:28.693789" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:28.693510" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.695088" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.694977" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.694959" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.700380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.700274" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.700256" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.701436" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.701056" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.701970" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:28.701619" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:28.702040" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:28.702194" 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-04-25T23:54:28.700685" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.707834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.707725" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.707706" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.709142" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.709037" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.709018" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.709725" 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-04-25T23:54:28.709350" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.710158" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.709908" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.711074" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.710789" elapsed="0.001185">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.712156" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:28.712201" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.710339" elapsed="0.001885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.713068" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.712790" elapsed="0.001317">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.714282" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:28.714327" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.712388" elapsed="0.001961"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.715423" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.714671" elapsed="0.000830">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.714423" elapsed="0.001170">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.714403" elapsed="0.001225">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.715803" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.716027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.715890" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.715873" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.716153" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.719239" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:54:28.719458" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.718470" elapsed="0.001082"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.720528" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.721530" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.717010" elapsed="0.004759"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.716411" elapsed="0.005507"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.708734" elapsed="0.013270">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</kw>
<msg time="2026-04-25T23:54:28.722106" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.722150" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Label_Is_Modified_Via_Json"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.708048" elapsed="0.014125"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.722356" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.722249" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.722230" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.723246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.723142" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.723124" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.723582" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.723707" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.723458" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.724137" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.723883" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.724566" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.724327" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.725140" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:54:28.725555" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:28.725600" 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-04-25T23:54:28.724782" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.726545" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.728638" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.728225" elapsed="0.000953">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.726973" elapsed="0.002281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.730933" 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-04-25T23:54:28.729483" elapsed="0.001869"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.726043" elapsed="0.005411"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.725823" elapsed="0.005682"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.725803" elapsed="0.005727"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.732463" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.732066" elapsed="0.000424"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:28.732537" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.732702" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.731748" elapsed="0.000979"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.732877" elapsed="0.000576"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.733761" level="INFO">index=36
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.733620" elapsed="0.000268"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.734068" elapsed="0.002675"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.737171" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:28.738149" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.736907" elapsed="0.001617">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.748817" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:54:28.749190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.747465" elapsed="0.001811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.749639" elapsed="0.000189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.750098" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.739356" elapsed="0.010886"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.738849" elapsed="0.011441"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.722850" elapsed="0.027537">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.750764" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.750839" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.707373" elapsed="0.043573">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:28.751052" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.751095" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.702592" elapsed="0.048526"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.751446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.751196" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.751177" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:28.702440" elapsed="0.049106"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:28.702269" elapsed="0.049308"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:28.699911" elapsed="0.051721"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:28.694677" elapsed="0.057027"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.694201" elapsed="0.057548"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:28.691171" elapsed="0.060630"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.753094" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.752695" 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-04-25T23:54:28.760844" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.760576" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.761282" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.761039" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:28.766243" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.763534" elapsed="0.004557">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.761390" elapsed="0.006786">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.768373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.768211" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.761372" elapsed="0.007088">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.768862" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.768995" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.768957" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.768940" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.769195" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.769263" 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-04-25T23:54:28.756132" elapsed="0.013235">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.769436" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.753330" elapsed="0.016201">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.769608" elapsed="0.000020"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.752393" elapsed="0.017340">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.769987" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.769811" elapsed="0.000236"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.770212" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.770071" elapsed="0.000209"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.770444" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.770304" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.769793" elapsed="0.000723"/>
</if>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content Modified via JSON&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<status status="FAIL" start="2026-04-25T23:54:28.752011" elapsed="0.018585">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.690531" elapsed="0.080302">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t20" name="Create_Car_List" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:28.774402" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:28.774144" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.775714" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.775586" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.775568" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.781119" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.780979" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.780956" elapsed="0.000248"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.782320" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.781918" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.782864" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:28.782509" elapsed="0.000382"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:28.782937" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:28.783097" 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-04-25T23:54:28.781442" elapsed="0.001680"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.788643" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.788531" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.788511" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.789986" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.789855" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.789836" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.790566" 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-04-25T23:54:28.790200" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.791037" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.790782" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.792036" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.791749" elapsed="0.001183">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.793114" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:28.793159" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.791220" elapsed="0.001963"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.794034" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.793751" elapsed="0.001358">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:28.795287" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:28.795332" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.793347" elapsed="0.002008"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.796315" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.795647" elapsed="0.000749">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.795430" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.795410" elapsed="0.001115">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.796749" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.796983" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.796840" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.796822" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.797150" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.800438" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:54:28.800683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.799557" elapsed="0.001226"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.801760" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.802813" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.798020" elapsed="0.004907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.797422" elapsed="0.005619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.789523" elapsed="0.013604">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</status>
</kw>
<msg time="2026-04-25T23:54:28.803228" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.803273" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Create_Car_List"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.788877" elapsed="0.014420"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.803482" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.803374" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.803355" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.804344" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:28.804240" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.804221" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.804690" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.804793" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:28.804556" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.805222" level="INFO">{1: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.804966" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.805651" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.805410" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.806219" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:54:28.806631" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:28.806815" 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-04-25T23:54:28.805863" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.807637" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.809907" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.809468" elapsed="0.000970">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.808044" elapsed="0.002471"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.812173" elapsed="0.000420"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.810905" elapsed="0.001793"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:28.807134" elapsed="0.005704"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.806917" elapsed="0.006032"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.806898" elapsed="0.006090"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.814191" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.813648" elapsed="0.000577"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:28.814291" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:54:28.814486" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.813241" elapsed="0.001278"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.814774" elapsed="0.000542"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.815638" level="INFO">index=37
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:28.815511" elapsed="0.000293"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.815972" elapsed="0.002301"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:28.818865" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:28.819726" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.818433" elapsed="0.001674">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:28.830504" elapsed="0.000343"/>
</kw>
<msg time="2026-04-25T23:54:28.830904" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.829203" 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-04-25T23:54:28.831318" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.831574" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:28.820925" elapsed="0.010807"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:28.820388" elapsed="0.011394"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.803950" elapsed="0.027916">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.832202" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.832276" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.788189" elapsed="0.044191">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:28.832486" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:28.832529" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.783506" elapsed="0.049045"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.832936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.832630" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.832611" elapsed="0.000402"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:28.783363" elapsed="0.049674"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:28.783180" elapsed="0.049890"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:28.780534" elapsed="0.052592"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:28.775300" elapsed="0.057883"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:28.774872" elapsed="0.058398"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:28.771841" elapsed="0.061484"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.834226" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:28.833496" elapsed="0.000758"/>
</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-04-25T23:54:28.869037" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.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-04-25T23:54:28.868635" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.869847" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.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-04-25T23:54:28.869565" elapsed="0.000357">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.870015" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.869234" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.870588" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.870204" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.870944" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.871118" 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-04-25T23:54:28.870801" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.871540" 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-04-25T23:54:28.871298" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.872551" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.872297" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.873045" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.872766" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.873879" 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-04-25T23:54:28.873475" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.874738" 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-04-25T23:54:28.874416" elapsed="0.000350"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.874817" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:54:28.874980" 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-04-25T23:54:28.874099" elapsed="0.000905"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.875155" elapsed="0.000240"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:28.873322" elapsed="0.002113"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.877809" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:28.875695" elapsed="0.002141"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:28.878584" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.878345" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:28.878679" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:54:28.878847" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:28.878025" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.879078" elapsed="0.000226"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:28.875548" elapsed="0.003798"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.873131" elapsed="0.006250"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:28.879424" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:28.879581" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:28.871974" elapsed="0.007632"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.871672" elapsed="0.007966"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.879844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.879694" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.871634" elapsed="0.008286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.880634" level="INFO">${final_text} = /restconf/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-04-25T23:54:28.880060" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.880731" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.868019" elapsed="0.012836"/>
</kw>
<msg time="2026-04-25T23:54:28.880909" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.855073" elapsed="0.025885"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.893780" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.906342" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.918695" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.918900" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.919072" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.919438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.919296" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.919281" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.919665" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.919833" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.919996" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.919253" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.919150" 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-04-25T23:54:28.920262" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.920337" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:28.920456" level="INFO">${uri} = /restconf/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-04-25T23:54:28.850587" elapsed="0.069896"/>
</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-04-25T23:54:28.945271" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.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-04-25T23:54:28.944895" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.946048" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.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-04-25T23:54:28.945800" elapsed="0.000313">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.946206" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.945458" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.946806" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/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-04-25T23:54:28.946388" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.947126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:28.947266" level="INFO">${template} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:28.946991" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.947700" level="INFO">&lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.947444" 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-04-25T23:54:28.948099" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.947812" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.948613" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.948322" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.948180" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.947794" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.949486" level="INFO">${final_text} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&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-04-25T23:54:28.948854" elapsed="0.000662"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:28.949565" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:28.944271" elapsed="0.005435"/>
</kw>
<msg time="2026-04-25T23:54:28.949760" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:28.931540" elapsed="0.018267"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.962479" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.974959" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.987347" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.987540" 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-04-25T23:54:28.987725" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.988095" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.987949" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:28.987935" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.988307" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.988471" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.988633" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:28.987906" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.987803" 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-04-25T23:54:28.988871" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:28.988944" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:28.989061" level="INFO">${data} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&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-04-25T23:54:28.930608" elapsed="0.058481"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:28.990435" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.990187" elapsed="0.000313">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:28.990591" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:28.989848" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:28.990961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:28.990703" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.991558" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:28.991263" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:28.991084" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:28.990684" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.993989" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:28.991806" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:28.994066" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.994219" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:28.989491" elapsed="0.004753"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.995802" level="INFO">/restconf/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-04-25T23:54:28.995537" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.996237" level="INFO">&lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.995999" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.996686" 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-04-25T23:54:28.996430" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.997119" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:28.996878" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:28.997978" 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-04-25T23:54:28.997778" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:28.998330" 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-04-25T23:54:28.998155" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:28.998501" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:28.999131" 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-04-25T23:54:28.998886" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:28.999215" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:28.999367" 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-04-25T23:54:28.997359" elapsed="0.002032"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.004424" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.001767" elapsed="0.004364">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:28.999460" elapsed="0.006758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.006402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.006252" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:28.999443" elapsed="0.007049">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.006910" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.007098" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.007060" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.007040" 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-04-25T23:54:29.007301" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.007367" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.994573" elapsed="0.012899">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.007554" 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-04-25T23:54:28.839212" elapsed="0.168435">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:29.007953" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.007778" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.007761" elapsed="0.000281"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.008074" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}cars</arg>
<arg>${mapping}</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-04-25T23:54:28.834509" elapsed="0.173658">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to create a list of cars in the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:54:28.771228" elapsed="0.237097">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t21" name="Check_Car_List_Created" line="171">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.011875" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.011590" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.013167" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.013055" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.013035" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.018401" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.018293" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.018275" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.019518" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.019127" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.020040" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.019722" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.020116" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.020272" 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-04-25T23:54:29.018707" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.025846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.025737" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.025717" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.027217" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.027098" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.027080" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.027815" level="INFO">${karaf_connection_index} = 37</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.027427" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.028274" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.028001" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.029169" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.028872" elapsed="0.001206">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.030274" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.030320" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.028461" elapsed="0.001882"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.031242" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.030945" elapsed="0.001355">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.032482" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.032528" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.030510" elapsed="0.002041"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.033488" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.032865" elapsed="0.000704">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.032627" elapsed="0.001194">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.032608" elapsed="0.001251">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.034023" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.034259" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.034112" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.034093" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.034394" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.037513" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:54:29.037757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.036838" 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-04-25T23:54:29.038799" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.039881" 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-04-25T23:54:29.035294" elapsed="0.004704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.034672" elapsed="0.005442"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.026766" elapsed="0.013435">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</status>
</kw>
<msg time="2026-04-25T23:54:29.040304" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.040357" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Car_List_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.026066" elapsed="0.014349"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.040608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.040497" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.040476" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.041500" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.041391" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.041372" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.041865" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.041968" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.041736" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.042574" level="INFO">{1: 37}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.042304" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.043070" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.042786" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.043642" elapsed="0.000441"/>
</kw>
<msg time="2026-04-25T23:54:29.044185" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.044232" level="INFO">${old_connection_index} = 37</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.043272" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.045102" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.047247" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.046807" elapsed="0.001145">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.045510" elapsed="0.002519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.049694" elapsed="0.000445"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.048264" elapsed="0.001941"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.044569" elapsed="0.005740"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.044333" elapsed="0.006029"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.044313" elapsed="0.006075"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.051413" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.050989" elapsed="0.000451"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.051488" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:29.051645" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.050601" elapsed="0.001106"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.051863" elapsed="0.000439"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.052583" level="INFO">index=38
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.052471" elapsed="0.000269"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.052886" elapsed="0.002511"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.055968" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.057125" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.055561" elapsed="0.001958">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.068272" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:54:29.068825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.066967" elapsed="0.001961"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.069294" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.069564" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.058422" elapsed="0.011651"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.057874" elapsed="0.012250"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.041089" elapsed="0.029121">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.070568" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.070644" elapsed="0.000041"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.025378" elapsed="0.045399">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.070901" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.070947" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.020724" elapsed="0.050248"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.071314" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.071053" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.071033" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.020567" elapsed="0.050854"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.020387" elapsed="0.051070"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.017917" elapsed="0.053598"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.012751" elapsed="0.058822"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.012301" elapsed="0.059320"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.009390" elapsed="0.062306"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.072539" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.072137" 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-04-25T23:54:29.079997" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.079743" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.080445" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.080196" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.085187" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.082804" elapsed="0.004061">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.080561" elapsed="0.006445">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.087199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.087046" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.080542" elapsed="0.006744">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.087691" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.087825" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.087789" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.087772" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.088028" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.088100" 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-04-25T23:54:29.075242" elapsed="0.012961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.088274" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.072799" elapsed="0.015568">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.088421" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.071863" elapsed="0.016647">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;KEEP&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.088693" elapsed="0.000023"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.088864" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089025" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089184" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089342" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089502" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089686" elapsed="0.000022"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.089849" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.090009" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.090167" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.090324" elapsed="0.000019"/>
</kw>
<doc>Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.008793" elapsed="0.081694">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t22" name="Add_Device_Data_Item_1_Via_XML_Post" line="186">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.093963" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.093694" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.095256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.095145" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.095125" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.100479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.100371" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.100352" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.101563" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.101175" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.102085" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.101775" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.102157" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.102314" 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-04-25T23:54:29.100794" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.107924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.107805" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.107786" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.109242" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.109134" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.109116" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.109837" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.109453" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.110292" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.110038" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.111187" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.110894" elapsed="0.001284">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.112358" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.112404" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.110480" elapsed="0.001947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.113300" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.113014" elapsed="0.001337">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.114530" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.114575" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.112593" elapsed="0.002006"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.115726" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.114939" elapsed="0.000870">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.114691" elapsed="0.001214">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.114670" elapsed="0.001270">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.116111" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.116379" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.116198" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.116181" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.116514" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.119550" elapsed="0.000172"/>
</kw>
<msg time="2026-04-25T23:54:29.119797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.118901" elapsed="0.000993"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.120845" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.121894" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.117384" elapsed="0.004628"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.116789" elapsed="0.005347"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.108817" elapsed="0.013405">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</status>
</kw>
<msg time="2026-04-25T23:54:29.122325" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.122368" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_1_Via_XML_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.108140" elapsed="0.014251"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.122577" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.122469" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.122450" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.123492" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.123385" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.123367" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.123843" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.123947" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.123725" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.124391" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.124130" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.124891" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.124584" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.125452" elapsed="0.000458"/>
</kw>
<msg time="2026-04-25T23:54:29.126010" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.126056" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.125091" elapsed="0.000988"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.126910" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.129050" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.128612" elapsed="0.000984">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.127347" elapsed="0.002458"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.131332" elapsed="0.000377"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.130046" elapsed="0.001729"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.126385" elapsed="0.005490"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.126162" elapsed="0.005765"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.126137" elapsed="0.005848"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.132961" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.132533" elapsed="0.000455"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.133039" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:54:29.133196" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.132198" elapsed="0.001023"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.133382" elapsed="0.000457"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.134277" level="INFO">index=39
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.134006" elapsed="0.000408"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.134562" elapsed="0.002307"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.137296" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.138113" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.137033" elapsed="0.001461">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.148749" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:54:29.149125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.147438" elapsed="0.001776"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.149553" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.149991" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.139329" elapsed="0.010805"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.138786" elapsed="0.011397"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.123080" elapsed="0.027186">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.150612" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.150710" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.107445" elapsed="0.043373">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.150924" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.150988" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.102731" elapsed="0.048282"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.151341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.151090" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.151072" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.102571" elapsed="0.048869"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.102394" elapsed="0.049076"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.100000" elapsed="0.051528"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.094828" elapsed="0.056763"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.094380" elapsed="0.057257"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.091512" elapsed="0.060233"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.152354" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:29.151917" elapsed="0.000464"/>
</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-04-25T23:54:29.187254" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.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-04-25T23:54:29.186827" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.188055" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.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-04-25T23:54:29.187800" elapsed="0.000321">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.188217" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.187448" elapsed="0.000794"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.188816" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.188404" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.189156" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:29.189321" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:29.189006" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.189769" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.189504" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.190798" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.190519" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.191299" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.191019" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.192009" 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-04-25T23:54:29.191706" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.192830" 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-04-25T23:54:29.192554" elapsed="0.000303"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.192908" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:29.193063" 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-04-25T23:54:29.192233" elapsed="0.000855"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.193247" elapsed="0.000234"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:29.191553" elapsed="0.001968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.194087" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:29.193786" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.194884" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.194624" elapsed="0.000286"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.194963" elapsed="0.000061"/>
</return>
<msg time="2026-04-25T23:54:29.195159" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:29.194306" 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-04-25T23:54:29.195338" elapsed="0.000225"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:29.193634" elapsed="0.002036"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.191378" elapsed="0.004333"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.195754" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:29.195918" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:29.190193" elapsed="0.005750"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.189882" elapsed="0.006093"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.196155" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.196001" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.189862" elapsed="0.006375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.197156" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:29.196381" elapsed="0.000810"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:29.197241" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:29.186192" elapsed="0.011176"/>
</kw>
<msg time="2026-04-25T23:54:29.197423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.173395" elapsed="0.024076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.210138" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.222800" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.235592" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.235821" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.236005" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.236383" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.236228" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.236213" elapsed="0.000262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.236617" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.236821" elapsed="0.000026"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.236996" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:29.236186" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.236084" elapsed="0.001031"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.237267" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.237343" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:29.237482" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:54:29.168903" elapsed="0.068608"/>
</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-04-25T23:54:29.262942" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.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-04-25T23:54:29.262534" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.263767" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.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-04-25T23:54:29.263513" elapsed="0.000325">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.263950" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.263167" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.264573" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/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-04-25T23:54:29.264149" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.264927" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:29.265101" level="INFO">${template} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:29.264777" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.265565" level="INFO">&lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;category&gt;microcar&lt;/category&gt;
&lt;/car-entry&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.265307" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:54:29.266036" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.265703" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.266597" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.266288" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.266126" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.265681" elapsed="0.001018"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.267377" level="INFO">${final_text} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:29.266842" elapsed="0.000567"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:29.267458" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:29.261892" elapsed="0.005697"/>
</kw>
<msg time="2026-04-25T23:54:29.267644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.248826" elapsed="0.018919"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.282749" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.295526" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.308389" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.308588" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.308798" elapsed="0.000025"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.309210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.309064" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.309049" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.309430" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.309596" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.309796" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:29.309017" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.308887" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.310056" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.310138" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:54:29.310263" level="INFO">${data} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</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-04-25T23:54:29.247904" elapsed="0.062388"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.311636" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.311379" elapsed="0.000354">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.311837" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.311012" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.312248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.311991" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.312843" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.312506" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.312331" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.311965" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.315385" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.313100" elapsed="0.002313"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:29.315466" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.315624" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:29.310626" elapsed="0.005023"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.317297" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.317031" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.317759" level="INFO">&lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;category&gt;microcar&lt;/category&gt;
&lt;/car-entry&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.317496" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.318267" 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-04-25T23:54:29.317987" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.318726" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.318465" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.319647" 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-04-25T23:54:29.319443" elapsed="0.000246"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:29.320047" 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-04-25T23:54:29.319851" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.320251" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.320908" 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-04-25T23:54:29.320624" elapsed="0.000332"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:29.321001" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:29.321185" 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-04-25T23:54:29.318992" elapsed="0.002221"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.326640" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.323869" elapsed="0.004595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.321288" elapsed="0.007267">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.328759" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.328589" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.321269" elapsed="0.007582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.329265" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.329447" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.329408" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.329390" 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-04-25T23:54:29.329673" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.329744" 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-04-25T23:54:29.316025" elapsed="0.013826">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.329935" 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-04-25T23:54:29.157343" elapsed="0.172705">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:29.330381" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.330178" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.330159" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.330513" elapsed="0.000016"/>
</return>
<arg>${directory_with_template_folders}${/}item1</arg>
<arg>${mapping}</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-04-25T23:54:29.152649" elapsed="0.177963">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to create a data item in the test list and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.090946" elapsed="0.239844">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t23" name="Check_Item1_Is_Created" line="191">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.334185" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.333900" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.335567" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.335455" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.335435" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.340923" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.340814" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.340794" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.342059" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.341647" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.342591" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.342256" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.342679" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:29.342840" 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-04-25T23:54:29.341226" elapsed="0.001673"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.348585" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.348452" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.348430" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.350027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.349918" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.349899" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.350674" level="INFO">${karaf_connection_index} = 39</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.350237" elapsed="0.000466"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.351151" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.350863" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.352085" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.351801" elapsed="0.001235">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.353221" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.353267" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.351339" elapsed="0.001951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.354212" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.353927" elapsed="0.001410">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.355537" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.355589" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.353470" elapsed="0.002142"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.356588" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.355960" elapsed="0.000747">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.355732" elapsed="0.001082">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.355708" elapsed="0.001284">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.357162" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.357389" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.357249" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.357232" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.357532" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.360748" elapsed="0.000159"/>
</kw>
<msg time="2026-04-25T23:54:29.360983" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.360069" elapsed="0.001012"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.362079" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.363200" elapsed="0.000040"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.358444" elapsed="0.004879"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.357854" elapsed="0.005583"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.349581" elapsed="0.013942">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:54:29.363699" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.363752" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item1_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.348876" elapsed="0.014919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.363991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.363879" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.363859" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.364917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.364796" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.364765" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.365258" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.365360" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.365135" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.365866" level="INFO">{1: 39}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.365538" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.366318" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.366068" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.367018" elapsed="0.000361"/>
</kw>
<msg time="2026-04-25T23:54:29.367481" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.367528" level="INFO">${old_connection_index} = 39</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.366518" elapsed="0.001033"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.368421" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.370641" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.370215" elapsed="0.001179">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.368875" elapsed="0.002598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.373073" elapsed="0.000368"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.371724" elapsed="0.001783"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.367906" elapsed="0.005704"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.367627" elapsed="0.006049"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.367608" elapsed="0.006096"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.374770" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.374289" elapsed="0.000509"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.374871" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:54:29.375056" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.373955" elapsed="0.001129"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.375256" elapsed="0.000439"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.376018" level="INFO">index=40
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.375880" elapsed="0.000273"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.376302" elapsed="0.002633"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.379515" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.380488" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.379240" elapsed="0.001641">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.391887" elapsed="0.000370"/>
</kw>
<msg time="2026-04-25T23:54:29.392321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.390426" elapsed="0.001987"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.393051" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.393370" 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-04-25T23:54:29.381727" elapsed="0.011792"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.381194" elapsed="0.012375"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.364445" elapsed="0.029229">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.394013" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.394088" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.348081" elapsed="0.046132">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.394348" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.394393" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.343308" elapsed="0.051108"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.394776" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.394496" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.394476" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.343150" elapsed="0.051729"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.342955" elapsed="0.051954"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.340420" elapsed="0.054544"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.335107" elapsed="0.059913"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.334647" elapsed="0.060419"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.331638" elapsed="0.063482"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.396034" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.395622" elapsed="0.000440"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.403754" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.403476" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.404202" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.403954" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.409345" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.406684" elapsed="0.004368">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.404313" elapsed="0.006885">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.411390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.411237" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.404293" elapsed="0.007227">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.411925" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.412060" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.412022" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.412005" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.412263" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.412334" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.398834" elapsed="0.013603">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.412544" elapsed="0.000020"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.396317" elapsed="0.016352">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.412727" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.395345" elapsed="0.017475">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.412983" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.413153" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.413314" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.413476" elapsed="0.000038"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.413705" elapsed="0.000024"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.413876" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.414037" elapsed="0.000023"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.414201" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.414360" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.414539" elapsed="0.000037"/>
</kw>
<doc>Get the device data as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.331019" elapsed="0.083768">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t24" name="Add_Device_Data_Item_2_Via_JSON_Post" line="205">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.418156" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.417896" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.419695" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.419533" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.419513" elapsed="0.000254"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.425047" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.424936" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.424916" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.426178" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.425760" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.426680" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.426364" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.426788" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:54:29.426962" 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-04-25T23:54:29.425339" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.432699" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.432571" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.432551" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.434088" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.433974" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.433954" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.434678" level="INFO">${karaf_connection_index} = 40</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.434296" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.435156" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.434876" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.436104" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.435781" elapsed="0.001282">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.437248" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.437294" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.435375" elapsed="0.001941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.438224" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.437897" elapsed="0.001452">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.439533" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.439579" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.437483" elapsed="0.002119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.440750" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.439916" elapsed="0.000917">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.439696" elapsed="0.001233">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.439674" elapsed="0.001356">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.441211" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.441439" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.441299" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.441281" elapsed="0.000258"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.441572" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.444895" elapsed="0.000177"/>
</kw>
<msg time="2026-04-25T23:54:29.445166" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.444044" elapsed="0.001222"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.446229" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.447248" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.442478" elapsed="0.004894"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.441850" elapsed="0.005638"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.433594" elapsed="0.013981">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</kw>
<msg time="2026-04-25T23:54:29.447701" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.447747" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Add_Device_Data_Item_2_Via_JSON_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.432954" elapsed="0.014816"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.447958" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.447849" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.447830" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.448914" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.448800" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.448782" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.449286" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.449393" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.449144" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.449862" level="INFO">{1: 40}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.449577" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.450506" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.450055" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.451212" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:54:29.451645" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.451710" level="INFO">${old_connection_index} = 40</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.450829" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.452546" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.454812" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.454234" elapsed="0.001147">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.452967" elapsed="0.002519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.457021" elapsed="0.000480"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.455747" elapsed="0.001846"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.452031" elapsed="0.005777"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.451811" elapsed="0.006054"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.451793" elapsed="0.006101"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.458913" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.458461" elapsed="0.000480"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.458993" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:54:29.459155" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.458119" elapsed="0.001061"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.459369" elapsed="0.000589"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.460419" level="INFO">index=41
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.460130" elapsed="0.000421"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.460719" elapsed="0.002566"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.463777" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.464897" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.463452" elapsed="0.001842">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.475858" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:54:29.476253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.474218" elapsed="0.002126"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.476688" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.476950" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.466155" elapsed="0.010946"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.465583" elapsed="0.011567"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.448456" elapsed="0.028777">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.477576" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.477650" 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="FAIL" start="2026-04-25T23:54:29.432228" elapsed="0.045549">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.477888" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.477932" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.427395" elapsed="0.050561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.478301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.478037" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.478017" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.427253" elapsed="0.051149"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.427043" elapsed="0.051393"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.424511" elapsed="0.053988"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.419062" elapsed="0.059536"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.418583" elapsed="0.060063"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.415613" elapsed="0.063140"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.479396" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:29.478931" elapsed="0.000492"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.525907" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.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-04-25T23:54:29.525493" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.526699" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.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-04-25T23:54:29.526435" elapsed="0.000345">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.526878" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.526099" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.527485" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.527067" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.527851" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:29.528061" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:29.527699" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.528498" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.528247" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.529531" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.529272" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.530033" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.529750" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.530738" 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-04-25T23:54:29.530420" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.531567" 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-04-25T23:54:29.531312" elapsed="0.000281"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.531644" elapsed="0.000057"/>
</return>
<msg time="2026-04-25T23:54:29.531837" 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-04-25T23:54:29.530966" elapsed="0.000898"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.532013" elapsed="0.000236"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:29.530287" elapsed="0.002004"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.532897" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:29.532533" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.533693" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.533425" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.533770" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:29.533934" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:29.533109" elapsed="0.000891"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.534154" elapsed="0.000226"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:29.532403" elapsed="0.002019"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.530111" elapsed="0.004347"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.534501" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:29.534683" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:29.528945" elapsed="0.005765"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.528611" elapsed="0.006131"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.534924" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.534767" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.528591" elapsed="0.006412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.535956" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:29.535144" elapsed="0.000842"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:29.536035" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:29.524871" elapsed="0.011291"/>
</kw>
<msg time="2026-04-25T23:54:29.536217" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.512023" elapsed="0.024240"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.548784" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.561248" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.573924" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.574145" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.574330" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.574742" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.574581" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.574566" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.574960" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.575146" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.575383" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:29.574538" elapsed="0.000923"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.574429" elapsed="0.001060"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.575640" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.575736" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:54:29.575858" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:54:29.507530" elapsed="0.068354"/>
</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-04-25T23:54:29.601412" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/post_data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.601031" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.602212" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/post_data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.601997" elapsed="0.000280">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/post_data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.602370" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.601619" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.603012" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/post_data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.602568" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.603352" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/post_data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/post_data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:29.603489" level="INFO">${template} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:29.603199" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.603980" level="INFO">{
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.603700" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:54:29.604386" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.604094" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.604975" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.604629" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.604468" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.604076" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.605676" level="INFO">${final_text} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:29.605203" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:29.605756" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:29.600342" elapsed="0.005558"/>
</kw>
<msg time="2026-04-25T23:54:29.605991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.587226" elapsed="0.018818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.618963" elapsed="0.000109"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.631964" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.644579" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.644796" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.644969" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.645334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.645185" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.645171" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.645550" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.645731" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.645895" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:29.645144" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.645045" 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-04-25T23:54:29.646113" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.646186" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:29.646307" level="INFO">${data} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</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-04-25T23:54:29.586325" elapsed="0.060009"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.647629" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.647379" elapsed="0.000331">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.647804" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.647007" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.648218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.647937" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.648793" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.648480" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.648307" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.647917" elapsed="0.000959"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.651232" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.649026" elapsed="0.002233"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:29.651333" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:29.651500" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:29.646679" elapsed="0.004846"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.653079" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.652829" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.653525" level="INFO">{
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.653275" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.653984" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.653738" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.654421" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.654175" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.655283" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:54:29.655088" elapsed="0.000248"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:29.655689" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:54:29.655497" elapsed="0.000219"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.655864" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.656461" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.656206" elapsed="0.000300"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:29.656548" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.656723" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.654680" elapsed="0.002068"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.663602" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.660761" elapsed="0.004570">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.656819" elapsed="0.008604">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.665637" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.665461" elapsed="0.000265"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.656801" elapsed="0.008949">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.666160" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.666346" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.666308" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.666289" 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-04-25T23:54:29.666558" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.666626" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.651870" elapsed="0.014881">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.666835" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.496058" elapsed="0.170873">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.667258" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.667055" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.667035" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.667406" elapsed="0.000015"/>
</return>
<arg>${directory_with_template_folders}${/}item2</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.491649" elapsed="0.175852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a JSON request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.414999" elapsed="0.252703">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t25" name="Check_Item2_Is_Created" 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-04-25T23:54:29.671283" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.671023" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.672622" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.672506" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.672487" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.677912" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.677801" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.677782" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.679010" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.678584" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.679523" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.679199" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.679595" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:29.679775" 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-04-25T23:54:29.678204" 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-04-25T23:54:29.685383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.685273" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.685254" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.686739" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.686603" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.686585" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.687351" level="INFO">${karaf_connection_index} = 41</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.686962" elapsed="0.000416"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.687817" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.687538" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.688705" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.688407" elapsed="0.001201">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.689815" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.689861" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.688009" elapsed="0.001876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.690768" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.690461" elapsed="0.001512">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.692157" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.692204" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.690061" elapsed="0.002166"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.693364" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.692527" elapsed="0.000922">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.692304" elapsed="0.001241">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.692284" elapsed="0.001458">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.693910" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.694149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.694005" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.693983" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.694281" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.697429" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:54:29.697674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.696740" elapsed="0.001033"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.698721" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.699789" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.695179" elapsed="0.004730"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.694551" elapsed="0.005474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.686296" elapsed="0.013822">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:54:29.700260" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.700306" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Item2_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.685602" elapsed="0.014728"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.700518" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.700408" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.700389" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.701413" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.701306" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.701287" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.701772" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.701876" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.701629" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.702325" level="INFO">{1: 41}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.702052" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.702783" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.702520" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.703393" elapsed="0.000450"/>
</kw>
<msg time="2026-04-25T23:54:29.703946" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.703993" level="INFO">${old_connection_index} = 41</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.702984" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.705002" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.707136" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.706703" elapsed="0.001020">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.705412" elapsed="0.002390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.709354" elapsed="0.000385"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.708038" elapsed="0.001767"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.704332" elapsed="0.005577"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.704100" elapsed="0.005861"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.704079" elapsed="0.005908"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.710986" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.710541" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.711064" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.711218" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.710192" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.711458" elapsed="0.000486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.712228" level="INFO">index=42
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.712118" elapsed="0.000259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.712527" elapsed="0.002676"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.715719" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.716615" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.715406" elapsed="0.001656">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.728129" elapsed="0.000327"/>
</kw>
<msg time="2026-04-25T23:54:29.728515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.726636" elapsed="0.001970"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.729003" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.729270" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.717998" elapsed="0.011416"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.717337" elapsed="0.012127"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.700992" elapsed="0.028559">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.730261" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.730341" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.684929" elapsed="0.045518">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.730554" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.730598" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.680234" elapsed="0.050386"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.731007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.730715" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.730695" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.680089" elapsed="0.051020"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.679904" elapsed="0.051237"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.677403" elapsed="0.053796"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.672209" elapsed="0.059044"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.671760" elapsed="0.059537"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.668779" elapsed="0.062587"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.732349" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.731935" 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-04-25T23:54:29.740164" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.739851" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.740615" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.740366" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.745528" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.743073" elapsed="0.004186">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.740749" elapsed="0.006665">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.747608" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.747453" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.740729" elapsed="0.006986">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.748136" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.748280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.748242" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.748223" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.748488" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.748559" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.735177" elapsed="0.013504">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.748755" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.732593" elapsed="0.016259">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.748906" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.731527" elapsed="0.017471">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.749193" elapsed="0.000027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.749374" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.749538" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.749715" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.749879" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.750041" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.750250" elapsed="0.000024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.750422" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.750585" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.750767" elapsed="0.000021"/>
</kw>
<doc>Get the device data as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.668122" elapsed="0.082807">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t26" name="Delete_Device_Data" line="224">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.754430" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.754124" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.755775" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.755645" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.755625" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.761118" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.761007" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.760988" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.762239" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.761854" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.762788" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.762462" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.762862" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.763021" 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-04-25T23:54:29.761452" elapsed="0.001594"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.768750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.768621" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.768600" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.770100" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.769986" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.769966" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.770744" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.770310" elapsed="0.000461"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.771178" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.770929" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.772107" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.771837" elapsed="0.001189">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.773206" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.773252" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.771376" elapsed="0.001899"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.774172" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.773895" elapsed="0.001361">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.775463" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.775510" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.773441" elapsed="0.002111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.776705" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_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-04-25T23:54:29.775900" elapsed="0.000895">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_Data"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.775672" elapsed="0.001217">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_Data"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.775633" elapsed="0.001292">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_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-04-25T23:54:29.777085" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.777309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.777171" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.777154" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.777473" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.780691" elapsed="0.000161"/>
</kw>
<msg time="2026-04-25T23:54:29.780926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.779979" elapsed="0.001045"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.781986" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.783060" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.778380" elapsed="0.004802"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.777786" elapsed="0.005513"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.769674" elapsed="0.013762">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_Data"</status>
</kw>
<msg time="2026-04-25T23:54:29.783557" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.783602" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Delete_Device_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-04-25T23:54:29.768967" elapsed="0.014658"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.783842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.783732" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.783706" elapsed="0.000201"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.784710" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.784583" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.784565" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.785039" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.785142" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.784924" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.785572" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.785317" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.786024" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.785780" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.786575" elapsed="0.000424"/>
</kw>
<msg time="2026-04-25T23:54:29.787097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.787143" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.786223" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.787987" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.790074" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.789642" elapsed="0.000958">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.788379" elapsed="0.002441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.792346" elapsed="0.000375"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.791058" elapsed="0.001728"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.787472" elapsed="0.005416"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.787240" elapsed="0.005699"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.787221" elapsed="0.005743"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.793966" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.793538" elapsed="0.000456"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.794044" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:29.794198" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.793166" elapsed="0.001057"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.794375" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.795256" level="INFO">index=43
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.794991" elapsed="0.000415"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.795560" elapsed="0.002273"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.798259" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.799155" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.797996" elapsed="0.001562">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.809775" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:54:29.810146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.808453" elapsed="0.001780"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.810559" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.810982" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.800352" elapsed="0.010794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.799848" elapsed="0.011346"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.784294" elapsed="0.026982">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.811645" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.811735" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.768239" elapsed="0.043600">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.811944" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.811988" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.763482" elapsed="0.048529"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.812336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.812087" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.812069" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.763280" elapsed="0.049154"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.763102" elapsed="0.049363"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.760617" elapsed="0.051904"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.755332" elapsed="0.057243"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.754867" elapsed="0.057753"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.751932" elapsed="0.060794"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.813330" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:54:29.812899" elapsed="0.000459"/>
</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-04-25T23:54:29.856669" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:29.856276" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.857421" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:54:29.857192" elapsed="0.000293">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:29.857576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:29.856862" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.858164" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:29.857780" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:29.858486" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:29.858636" 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-04-25T23:54:29.858349" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.859079" 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-04-25T23:54:29.858834" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.860108" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.859852" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.860569" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.860308" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.861262" 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-04-25T23:54:29.860967" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.862028" 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-04-25T23:54:29.861807" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.862103" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:29.862255" 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-04-25T23:54:29.861471" elapsed="0.000808"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.862427" elapsed="0.000243"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:29.860833" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.863249" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:29.862955" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:29.864028" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.863809" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:29.864123" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:54:29.864277" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:29.863477" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.864449" elapsed="0.000236"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:29.862824" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.860645" elapsed="0.004155"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:29.864845" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:29.865004" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:29.859510" elapsed="0.005523"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.859192" elapsed="0.005880"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.865276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.865103" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.859173" elapsed="0.006179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.866091" level="INFO">${final_text} = /restconf/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-04-25T23:54:29.865492" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:29.866168" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:29.855662" elapsed="0.010629"/>
</kw>
<msg time="2026-04-25T23:54:29.866345" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.842707" elapsed="0.023685"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.878916" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.891291" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.904553" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.904818" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.904996" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.905474" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.905326" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.905308" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.905707" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.905872" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.906034" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:29.905277" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.905152" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.906313" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.906390" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:54:29.906526" level="INFO">${uri} = /restconf/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-04-25T23:54:29.838413" elapsed="0.068139"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.907730" level="INFO">/restconf/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-04-25T23:54:29.907448" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.912354" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:29.909879" elapsed="0.004242">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.907842" elapsed="0.006379">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:29.914406" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.914258" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.907824" elapsed="0.006666">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:29.914876" elapsed="0.000025"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.914949" elapsed="0.000015"/>
</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-04-25T23:54:29.906845" elapsed="0.008206">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.915119" elapsed="0.000016"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.813579" elapsed="0.101632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<arg>${directory_with_template_folders}${/}item1</arg>
<arg>${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.915461" elapsed="0.000025"/>
</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-04-25T23:54:29.751306" elapsed="0.164331">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t27" name="Check_Device_Data_Is_Deleted" line="230">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:29.918949" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:29.918682" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.920432" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.920323" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.920148" elapsed="0.000351"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.925450" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.925344" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.925326" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.926516" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:29.926136" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.927009" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:29.926716" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:29.927079" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:29.927231" 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-04-25T23:54:29.925764" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.932842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.932735" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.932716" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.934147" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.934041" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.934023" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.934733" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.934355" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.935367" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.934917" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.936387" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.935989" elapsed="0.001295">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.937465" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:29.937511" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.935584" elapsed="0.001951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.938392" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.938106" elapsed="0.001325">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:29.939623" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:29.939685" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.937714" elapsed="0.001996"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.940639" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.940006" elapsed="0.000727">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.939784" elapsed="0.001040">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.939765" elapsed="0.001093">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.941018" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.941277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.941123" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.941102" elapsed="0.000269"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.941403" 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-04-25T23:54:29.944415" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:54:29.944633" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.943791" elapsed="0.000957"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.945721" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.946650" elapsed="0.000149"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.942298" elapsed="0.004580"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.941721" elapsed="0.005270"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.933741" elapsed="0.013333">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</status>
</kw>
<msg time="2026-04-25T23:54:29.947175" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.947218" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Data_Is_Deleted"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.933058" elapsed="0.014184"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.947423" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.947318" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.947299" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.948330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.948226" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.948209" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.948684" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.948788" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:29.948545" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.949260" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.948963" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.949811" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.949451" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.950363" elapsed="0.000434"/>
</kw>
<msg time="2026-04-25T23:54:29.950897" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:29.950943" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.950009" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.951785" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.955894" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.953453" elapsed="0.002991">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.952178" elapsed="0.004344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.958034" 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-04-25T23:54:29.956772" elapsed="0.001693"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:29.951259" elapsed="0.007308"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:29.951041" elapsed="0.007578"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.951022" elapsed="0.007623"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:29.959626" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.959210" elapsed="0.000457"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:29.959750" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:29.959906" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.958884" elapsed="0.001047"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:29.960105" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.960818" level="INFO">index=44
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:29.960711" 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-04-25T23:54:29.961111" elapsed="0.002359"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:29.963909" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:29.964765" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.963632" elapsed="0.001504">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:29.975571" elapsed="0.000330"/>
</kw>
<msg time="2026-04-25T23:54:29.975958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:29.974302" 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-04-25T23:54:29.976407" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.976686" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:29.965932" elapsed="0.010898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:29.965410" elapsed="0.011467"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.947910" elapsed="0.029048">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.977328" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.977401" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.932385" elapsed="0.045117">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:29.977605" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:29.977648" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.927639" elapsed="0.050239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.978203" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.977955" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:29.977936" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:29.927499" elapsed="0.050804"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:29.927307" elapsed="0.051025"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:29.924971" elapsed="0.053414"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:29.919877" elapsed="0.058562"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:29.919399" elapsed="0.059084"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.916359" elapsed="0.062174"/>
</kw>
<kw name="Regexp Escape" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.979023" level="INFO">${escaped} = urn:ietf:params:xml:ns:netconf:base:1\.0</msg>
<var>${escaped}</var>
<arg>${ODL_NETCONF_NAMESPACE}</arg>
<doc>Returns each argument escaped for use as a regular expression.</doc>
<status status="PASS" start="2026-04-25T23:54:29.978705" elapsed="0.000377"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.980398" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:29.980018" 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-04-25T23:54:29.988326" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.988010" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:29.988799" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:29.988527" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:29.993609" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.991037" elapsed="0.004287">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:29.988911" elapsed="0.006497">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.995610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.995442" elapsed="0.000251"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:29.988892" elapsed="0.006826">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.996090" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.996224" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:29.996184" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.996167" 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-04-25T23:54:29.996438" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.996506" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.983323" elapsed="0.013287">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.996697" elapsed="0.000018"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.980632" elapsed="0.016164">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:54:29.996849" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.979755" elapsed="0.017185">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.997240" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.997022" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.997628" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.997410" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:29.997970" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:29.997766" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:29.996998" elapsed="0.001083"/>
</if>
<arg>&lt;data xmlns\="${escaped}"(\/&gt;|&gt;&lt;\/data&gt;)</arg>
<arg>${True}</arg>
<status status="FAIL" start="2026-04-25T23:54:29.979291" elapsed="0.018908">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-25T23:54:29.915875" elapsed="0.082548">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t28" name="Deconfigure_Device_From_Netconf" line="235">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:30.002174" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:30.001907" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.003452" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.003334" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.003314" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.008734" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.008609" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.008590" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.009811" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:30.009402" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.010292" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:30.009996" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:30.010441" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:54:30.010612" 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-04-25T23:54:30.009028" elapsed="0.001608"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.016202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.016092" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.016073" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.017525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.017417" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.017399" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:30.018163" level="INFO">${karaf_connection_index} = 44</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.017768" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.018598" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.018347" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.019464" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.019195" elapsed="0.001317">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:30.020771" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:30.020818" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.018806" elapsed="0.002035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.021749" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.021448" elapsed="0.001399">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:30.023061" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:30.023108" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.021010" elapsed="0.002121"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.024091" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.023427" elapsed="0.000745">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:30.023208" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:30.023188" elapsed="0.001258">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.024609" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.024867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.024723" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.024703" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.024999" 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-04-25T23:54:30.028092" elapsed="0.000161"/>
</kw>
<msg time="2026-04-25T23:54:30.028324" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.027419" 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-04-25T23:54:30.029360" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.030313" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:30.025867" elapsed="0.004561"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:30.025260" elapsed="0.005285"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.017081" elapsed="0.013550">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</status>
</kw>
<msg time="2026-04-25T23:54:30.030848" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:30.030893" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Deconfigure_Device_From_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.016420" elapsed="0.014497"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.031103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.030994" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.030975" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.032021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.031913" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.031895" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.032357" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:30.032458" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:30.032242" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.032922" level="INFO">{1: 44}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.032633" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.033363" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.033122" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.033948" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:54:30.034367" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:30.034414" level="INFO">${old_connection_index} = 44</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.033561" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.035375" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.037564" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.037137" elapsed="0.001017">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.035824" elapsed="0.002408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:30.039963" elapsed="0.000372"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.038471" elapsed="0.001929"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:30.034857" elapsed="0.005647"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.034514" elapsed="0.006041"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.034494" elapsed="0.006087"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:30.041549" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.041140" elapsed="0.000436"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:30.041626" elapsed="0.000049"/>
</return>
<msg time="2026-04-25T23:54:30.041803" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:30.040802" elapsed="0.001026"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.041990" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.042703" level="INFO">index=45
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:30.042566" elapsed="0.000266"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.043049" elapsed="0.002451"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.045941" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:30.046839" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.045680" elapsed="0.001550">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.057681" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:54:30.058064" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.056369" elapsed="0.001785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.058497" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.058941" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:30.048082" elapsed="0.011006"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:30.047538" elapsed="0.011600"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.031586" elapsed="0.027642">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.059588" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.059678" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.015753" elapsed="0.044033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:30.059891" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:30.059935" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.011041" elapsed="0.048952"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.060338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.060073" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.060054" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:30.010898" elapsed="0.049541"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:30.010719" elapsed="0.049751"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:30.008232" elapsed="0.052293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:30.003039" elapsed="0.057542"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.002596" elapsed="0.058031"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:29.999612" elapsed="0.061086"/>
</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-04-25T23:54:30.080716" elapsed="0.000437"/>
</kw>
<msg time="2026-04-25T23:54:30.081207" 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-04-25T23:54:30.080325" elapsed="0.000934"/>
</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-04-25T23:54:30.079929" elapsed="0.001405"/>
</kw>
<msg time="2026-04-25T23:54:30.081377" 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-04-25T23:54:30.071058" elapsed="0.010361"/>
</kw>
<msg time="2026-04-25T23:54:30.081527" 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-04-25T23:54:30.070705" elapsed="0.010850"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.082469" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:54:30.081739" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:54:30.115801" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:54:30.115387" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:30.116750" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:54:30.116456" elapsed="0.000364">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:30.116913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:30.116118" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.117532" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:30.117136" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:30.117879" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:30.118039" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:30.117738" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.118529" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.118278" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.119585" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.119295" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.120086" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.119809" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.121037" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:30.120486" elapsed="0.000581"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.122231" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.121724" elapsed="0.000548"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.122390" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:54:30.122623" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:30.121262" elapsed="0.001388"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.122820" elapsed="0.000508"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:54:30.120352" elapsed="0.003018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.124167" 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-04-25T23:54:30.123633" elapsed="0.000563"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.125489" 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-04-25T23:54:30.124993" elapsed="0.000538"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.125649" elapsed="0.000056"/>
</return>
<msg time="2026-04-25T23:54:30.125907" 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-04-25T23:54:30.124381" elapsed="0.001556"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.126088" elapsed="0.000498"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:30.123485" elapsed="0.003144"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.127413" 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-04-25T23:54:30.126894" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.128672" 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-04-25T23:54:30.128168" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.128833" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:30.129058" 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-04-25T23:54:30.127716" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.129234" elapsed="0.000548"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:54:30.126761" elapsed="0.003063"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.130569" 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-04-25T23:54:30.130072" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.131749" 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-04-25T23:54:30.131232" elapsed="0.000560"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.131905" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:30.132130" 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-04-25T23:54:30.130793" elapsed="0.001362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.132305" elapsed="0.000497"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:54:30.129936" elapsed="0.002907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.133589" 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-04-25T23:54:30.133085" elapsed="0.000565"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.134877" 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-04-25T23:54:30.134384" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.135031" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:30.135255" 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-04-25T23:54:30.133938" elapsed="0.001343"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.135431" elapsed="0.000518"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:54:30.132954" elapsed="0.003038"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.136748" 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-04-25T23:54:30.136233" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.138009" 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-04-25T23:54:30.137439" elapsed="0.000610"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.138163" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:30.138389" 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-04-25T23:54:30.136957" elapsed="0.001457"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.138563" elapsed="0.000493"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:54:30.136104" elapsed="0.002999"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.139880" 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-04-25T23:54:30.139348" elapsed="0.000558"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.141026" 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-04-25T23:54:30.140525" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.141180" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:30.141406" 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-04-25T23:54:30.140088" elapsed="0.001343"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.141579" elapsed="0.000571"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:54:30.139216" elapsed="0.002976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.143130" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:30.142436" elapsed="0.000720"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:30.144310" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.143823" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:30.144465" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:30.144706" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:30.143340" elapsed="0.001391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.144880" elapsed="0.000484"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:30.142305" elapsed="0.003101"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:30.120168" elapsed="0.025273"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:30.145482" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:30.145642" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:30.118959" elapsed="0.026813"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.118643" elapsed="0.027162"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.145977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.145830" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.118622" elapsed="0.027430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.146899" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:54:30.146192" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:30.146975" elapsed="0.000073"/>
</return>
<arg>folder=${folder}</arg>
<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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:30.114761" elapsed="0.032388"/>
</kw>
<msg time="2026-04-25T23:54:30.147202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.101697" elapsed="0.045552"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.160049" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.172471" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.184804" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.184995" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.185171" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.185534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.185392" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.185377" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.185763" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.185929" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.186091" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:30.185350" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.185246" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.186311" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.186384" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:30.186493" level="INFO">${uri} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:54:30.097285" elapsed="0.089233"/>
</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-04-25T23:54:30.211416" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:54:30.211036" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:30.212179" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:54:30.211965" elapsed="0.000276">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:30.212333" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:30.211620" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.212918" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/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-04-25T23:54:30.212520" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:30.213237" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:30.213362" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:54:30.213103" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.213800" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.213541" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:54:30.214202" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.213912" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.214741" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:30.214427" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.214284" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.213894" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.215648" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:54:30.214967" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:30.215742" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:30.210373" elapsed="0.005495"/>
</kw>
<msg time="2026-04-25T23:54:30.215921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.197500" elapsed="0.018472"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.228909" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.241201" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.253526" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.253731" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.253906" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.254266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.254125" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.254110" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.254480" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.254644" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.254823" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:30.254083" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.253981" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.255042" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.255116" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:30.255233" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:54:30.196644" elapsed="0.058616"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:30.256536" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.256291" elapsed="0.000308">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:30.256709" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:30.255949" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.257044" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.256804" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.257584" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:30.257295" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.257125" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.256785" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.260207" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:30.257830" elapsed="0.002404"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:30.260285" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:30.260438" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:30.255590" elapsed="0.004872"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.262207" level="INFO">/restconf/operations/netconf-node-topology:delete-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.261952" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.262720" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.262450" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.263165" 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-04-25T23:54:30.262919" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.263598" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.263358" elapsed="0.000329"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:30.264521" 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-04-25T23:54:30.264327" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:30.264892" 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-04-25T23:54:30.264717" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.265063" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.265673" 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-04-25T23:54:30.265412" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:30.265759" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:30.265914" 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-04-25T23:54:30.263891" elapsed="0.002048"/>
</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">
<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="NOT RUN" start="2026-04-25T23:54:30.268130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.266008" elapsed="0.002187"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:30.270823" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:54:30.268356" elapsed="0.004196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:30.268219" elapsed="0.004423">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:30.265990" elapsed="0.006708">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.273077" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.273211" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.273175" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.273158" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.273414" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.273479" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.260811" elapsed="0.012772">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.273680" 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-04-25T23:54:30.085942" elapsed="0.187835">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:30.274119" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.273934" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.273916" elapsed="0.000293"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.274242" elapsed="0.000015"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.082941" elapsed="0.191398">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:30.082600" elapsed="0.191806">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.274691" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.274438" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:30.082578" elapsed="0.192202">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:54:30.274932" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type_rpc_delete}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.060975" elapsed="0.214075">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:54:29.998767" elapsed="0.276472">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s1-t29" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="245">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:30.279380" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:30.279118" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.280693" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.280566" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.280547" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.285772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.285651" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.285633" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.286870" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:30.286473" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.287353" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:30.287056" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:30.287422" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:30.287576" 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-04-25T23:54:30.286073" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.293079" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.292966" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.292948" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.294372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.294266" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.294248" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:30.294959" 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-04-25T23:54:30.294579" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.295392" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.295143" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.296409" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.296004" elapsed="0.001311">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:30.297496" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:30.297542" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.295575" elapsed="0.001990"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.298413" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.298139" elapsed="0.001341">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:30.299693" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:30.299741" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.297750" elapsed="0.002014"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.300674" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.300059" elapsed="0.000695">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:30.299840" elapsed="0.001008">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:30.299821" elapsed="0.001062">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.301043" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.301265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.301129" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.301112" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.301392" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.304398" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:54:30.304617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.303796" elapsed="0.000937"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.305633" elapsed="0.000134"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.306671" 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-04-25T23:54:30.302241" elapsed="0.004545"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:30.301665" elapsed="0.005234"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.293963" elapsed="0.013018">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<msg time="2026-04-25T23:54:30.307083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:30.307127" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.293296" elapsed="0.013854"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.307366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.307259" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.307240" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.308239" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.308134" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.308117" elapsed="0.000186"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.308573" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:30.308689" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:30.308451" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.309122" level="INFO">{1: 45}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.308868" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.309551" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.309313" 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-04-25T23:54:30.310209" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:54:30.310626" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:30.310689" 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-04-25T23:54:30.309854" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.311502" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.315435" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.313219" elapsed="0.002775">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.311934" elapsed="0.004142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:30.317843" elapsed="0.000363"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.316312" elapsed="0.001957"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:30.311005" elapsed="0.007364"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.310790" elapsed="0.007630"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.310772" elapsed="0.007673"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:30.319427" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.318985" elapsed="0.000468"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:30.319501" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:30.319687" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:30.318649" elapsed="0.001065"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.319866" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.320552" level="INFO">index=46
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:30.320445" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:30.320839" elapsed="0.002322"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:30.323579" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:30.324620" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.323320" elapsed="0.001690">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:30.335386" elapsed="0.000372"/>
</kw>
<msg time="2026-04-25T23:54:30.335817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:30.334129" elapsed="0.001775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.336278" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.336538" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:30.325924" elapsed="0.010774"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:30.325282" elapsed="0.011466"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.307843" elapsed="0.028987">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.337157" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.337229" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.292576" elapsed="0.044754">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:30.337433" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:30.337476" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.288011" elapsed="0.049488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.338065" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.337573" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.337556" elapsed="0.000585"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:30.287872" elapsed="0.050292"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:30.287695" elapsed="0.050499"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:30.285290" elapsed="0.052957"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:30.280278" elapsed="0.058023"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:30.279847" elapsed="0.058499"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:30.276742" elapsed="0.061654"/>
</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-04-25T23:54:30.351591" 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-04-25T23:54:30.349422" elapsed="0.002195"/>
</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-04-25T23:54:30.351979" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:30.351828" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.351708" elapsed="0.000355"/>
</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-04-25T23:54:30.352357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.352124" elapsed="0.000289"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.353147" level="INFO">${uri} = /restconf/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-04-25T23:54:30.352676" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:30.352436" 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-04-25T23:54:30.353395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.353234" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:30.352107" elapsed="0.001399"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:30.353541" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:30.353707" level="INFO">${uri} = /restconf/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-04-25T23:54:30.348930" elapsed="0.004803"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:30.353780" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:30.353922" level="INFO">${uri} = /restconf/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-04-25T23:54:30.348436" elapsed="0.005510"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.361223" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.360974" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:30.361673" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:30.361418" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:30.366273" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.363900" elapsed="0.004047">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:30.361785" elapsed="0.006253">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.368247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:30.368078" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:30.361766" elapsed="0.006569">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.368721" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.368853" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:30.368816" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:30.368799" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.369054" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.369125" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:30.356582" elapsed="0.012650">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.369302" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:30.354163" elapsed="0.015239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.369569" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:30.369748" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:30.369812" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:30.340534" elapsed="0.029376">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.370107" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:54:30.340092" elapsed="0.030126">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:30.377694" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:30.381281" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:54:30.339565" elapsed="0.041840">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:31.404487" 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-04-25T23:54:31.402156" elapsed="0.002372"/>
</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-04-25T23:54:31.404986" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:31.404819" elapsed="0.000229"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:31.404632" elapsed="0.000450"/>
</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-04-25T23:54:31.405462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:31.405177" 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-04-25T23:54:31.406301" level="INFO">${uri} = /restconf/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-04-25T23:54:31.405809" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:31.405548" elapsed="0.000817"/>
</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-04-25T23:54:31.406554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:31.406389" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:31.405152" elapsed="0.001480"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:31.406694" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:54:31.406892" level="INFO">${uri} = /restconf/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-04-25T23:54:31.401605" elapsed="0.005313"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:31.406969" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:31.407112" level="INFO">${uri} = /restconf/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-04-25T23:54:31.401038" elapsed="0.006099"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:31.415001" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:31.414718" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:31.415459" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:31.415206" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:31.420851" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:31.417744" elapsed="0.004877">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:31.415570" elapsed="0.007160">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.422995" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:31.422836" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:31.415551" elapsed="0.007544">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.423491" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:31.423626" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:31.423589" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:31.423572" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.423851" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:31.423922" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:31.409895" elapsed="0.014142">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:31.424122" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:54:31.407362" elapsed="0.016878">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.424418" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:31.424587" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:31.424650" elapsed="0.000038"/>
</return>
<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="FAIL" start="2026-04-25T23:54:31.388167" elapsed="0.036608">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.424941" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:54:31.386284" elapsed="0.038771">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:31.432750" elapsed="0.000030"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:31.436461" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:54:31.382559" elapsed="0.054032">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:32.454365" 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-04-25T23:54:32.452143" elapsed="0.002261"/>
</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-04-25T23:54:32.454914" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:32.454748" elapsed="0.000225"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:32.454582" elapsed="0.000423"/>
</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-04-25T23:54:32.455361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:32.455087" 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-04-25T23:54:32.456172" level="INFO">${uri} = /restconf/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-04-25T23:54:32.455690" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:32.455446" 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-04-25T23:54:32.456428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:32.456262" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:32.455063" elapsed="0.001441"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:32.456546" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:54:32.456760" level="INFO">${uri} = /restconf/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-04-25T23:54:32.451629" elapsed="0.005160"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:32.456840" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:32.456983" level="INFO">${uri} = /restconf/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-04-25T23:54:32.451100" elapsed="0.005909"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:32.464245" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:32.463983" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:32.464703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:32.464444" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:32.469777" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:32.466891" elapsed="0.004692">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:32.464838" elapsed="0.006853">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.471880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:32.471728" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:32.464820" elapsed="0.007147">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.472345" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:32.472474" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:32.472438" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:32.472421" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.472697" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:32.472819" 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-04-25T23:54:32.459645" elapsed="0.013285">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:32.473048" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-04-25T23:54:32.457228" elapsed="0.015923">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.473323" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:32.473493" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:32.473556" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:32.440221" elapsed="0.033455">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.473843" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:54:32.439156" elapsed="0.034797">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:32.481399" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:32.485035" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:54:32.437589" elapsed="0.047570">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:33.502525" 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-04-25T23:54:33.500313" elapsed="0.002246"/>
</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-04-25T23:54:33.502932" elapsed="0.000026"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:33.502775" elapsed="0.000219"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:33.502630" elapsed="0.000394"/>
</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-04-25T23:54:33.503355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:33.503094" 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-04-25T23:54:33.504166" level="INFO">${uri} = /restconf/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-04-25T23:54:33.503681" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:33.503436" 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-04-25T23:54:33.504418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:33.504254" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:33.503075" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:33.504531" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:54:33.504711" level="INFO">${uri} = /restconf/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-04-25T23:54:33.499832" elapsed="0.004906"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:33.504784" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:33.504929" level="INFO">${uri} = /restconf/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-04-25T23:54:33.499313" elapsed="0.005641"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:33.512796" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:33.512509" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:33.513247" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:33.512999" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:33.518217" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:33.515445" elapsed="0.004476">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:33.513382" elapsed="0.006625">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.520191" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:33.520041" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:33.513363" elapsed="0.006914">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.520668" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:33.520801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:33.520765" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:33.520748" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.521004" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:33.521073" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:33.507734" elapsed="0.013451">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:33.521257" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:33.505268" elapsed="0.016115">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.521555" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:33.521737" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:33.521802" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:33.488766" elapsed="0.033134">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.522062" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:54:33.487692" elapsed="0.034478">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:33.529456" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:33.533129" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:54:33.486245" elapsed="0.047023">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:34.550757" 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-04-25T23:54:34.548572" elapsed="0.002219"/>
</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-04-25T23:54:34.551151" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:34.550994" elapsed="0.000219"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:34.550862" 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-04-25T23:54:34.551574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:34.551313" 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-04-25T23:54:34.552375" level="INFO">${uri} = /restconf/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-04-25T23:54:34.551899" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:34.551669" 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-04-25T23:54:34.552624" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:34.552463" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:34.551293" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:34.552756" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:34.552918" level="INFO">${uri} = /restconf/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-04-25T23:54:34.548090" elapsed="0.004854"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:34.552990" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:34.553134" level="INFO">${uri} = /restconf/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-04-25T23:54:34.547569" elapsed="0.005590"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:34.560401" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:34.560142" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:34.560860" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:34.560597" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:34.565638" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:34.563026" elapsed="0.004303">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:34.560970" elapsed="0.006444">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.567599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:34.567449" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:34.560951" elapsed="0.006806">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.568138" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:34.568272" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:34.568235" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:34.568217" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.568476" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:34.568545" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:34.555809" elapsed="0.012859">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:34.568743" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:34.553376" elapsed="0.015466">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.569010" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:34.569174" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:34.569237" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:34.536706" elapsed="0.032628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.569495" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:54:34.535628" elapsed="0.033975">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:34.576985" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:34.580649" elapsed="0.000042"/>
</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="FAIL" start="2026-04-25T23:54:34.534277" elapsed="0.046513">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:35.600971" 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-04-25T23:54:35.598526" elapsed="0.002478"/>
</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-04-25T23:54:35.601370" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:35.601213" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:35.601079" elapsed="0.000377"/>
</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-04-25T23:54:35.601810" elapsed="0.000125"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:35.601529" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:35.602846" level="INFO">${uri} = /restconf/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-04-25T23:54:35.602266" elapsed="0.000608"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:35.602001" elapsed="0.000910"/>
</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-04-25T23:54:35.603102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:35.602936" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:35.601509" elapsed="0.001670"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:35.603227" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:54:35.603412" level="INFO">${uri} = /restconf/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-04-25T23:54:35.597798" elapsed="0.005640"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:35.603486" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:35.603628" level="INFO">${uri} = /restconf/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-04-25T23:54:35.597041" 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-04-25T23:54:35.611211" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:35.610949" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:35.611672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:35.611412" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:35.616761" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:35.613882" elapsed="0.004635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:35.611784" elapsed="0.006835">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.618839" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:35.618675" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:35.611766" elapsed="0.007161">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.619302" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:35.619432" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:35.619395" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:35.619379" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.619637" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:35.619721" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:35.606478" elapsed="0.013351">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:35.619900" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:35.603888" elapsed="0.016107">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.620198" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:35.620367" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:35.620430" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:35.584680" elapsed="0.035849">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.620759" elapsed="0.000023"/>
</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="FAIL" start="2026-04-25T23:54:35.583589" elapsed="0.037285">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:35.628617" elapsed="0.000031"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:35.632207" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:54:35.582002" elapsed="0.050332">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:36.650847" 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-04-25T23:54:36.648681" elapsed="0.002200"/>
</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-04-25T23:54:36.651256" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:36.651102" elapsed="0.000213"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:36.650966" 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-04-25T23:54:36.651698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:36.651416" 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-04-25T23:54:36.652492" level="INFO">${uri} = /restconf/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-04-25T23:54:36.652009" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:36.651781" 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-04-25T23:54:36.652768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:36.652587" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:36.651395" elapsed="0.001449"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:36.652882" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:54:36.653045" level="INFO">${uri} = /restconf/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-04-25T23:54:36.648179" elapsed="0.004890"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:36.653116" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:36.653256" level="INFO">${uri} = /restconf/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-04-25T23:54:36.647671" elapsed="0.005610"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:36.660692" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:36.660416" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:36.661132" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:36.660889" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:36.666162" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:36.663401" elapsed="0.004583">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:36.661315" elapsed="0.006762">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.668264" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:36.668113" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:36.661295" elapsed="0.007057">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.668745" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:36.668877" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:36.668840" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:36.668823" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.669079" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:36.669148" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:36.655948" elapsed="0.013307">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:36.669325" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:36.653501" elapsed="0.015920">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.669589" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:36.669769" elapsed="0.000022"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:36.669833" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:36.635825" elapsed="0.034119">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.670110" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:54:36.634730" elapsed="0.035489">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:36.677525" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:36.681101" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:54:36.633306" elapsed="0.047962">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:37.699897" 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-04-25T23:54:37.697690" elapsed="0.002241"/>
</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-04-25T23:54:37.700299" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:37.700141" elapsed="0.000217"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:37.700001" elapsed="0.000386"/>
</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-04-25T23:54:37.700743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:37.700461" 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-04-25T23:54:37.701547" level="INFO">${uri} = /restconf/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-04-25T23:54:37.701056" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:37.700826" 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-04-25T23:54:37.701816" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:37.701636" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:37.700441" elapsed="0.001454"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:37.701933" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:54:37.702099" level="INFO">${uri} = /restconf/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-04-25T23:54:37.697060" elapsed="0.005070"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:37.702188" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:37.702344" level="INFO">${uri} = /restconf/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-04-25T23:54:37.696525" elapsed="0.005844"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:37.712166" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:37.711897" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:37.712636" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:37.712375" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:37.717623" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:37.714866" elapsed="0.004500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:37.712768" elapsed="0.006692">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.719704" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:37.719529" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:37.712748" elapsed="0.007055">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.720185" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:37.720376" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:37.720284" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:37.720266" elapsed="0.000186"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.720594" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:37.720682" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:37.707413" elapsed="0.013381">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:37.720867" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:37.702592" elapsed="0.018373">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.721134" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:37.721301" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:37.721365" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:37.684802" elapsed="0.036671">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.721639" elapsed="0.000044"/>
</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="FAIL" start="2026-04-25T23:54:37.683693" elapsed="0.038083">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:37.729048" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:37.732663" elapsed="0.000029"/>
</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="FAIL" start="2026-04-25T23:54:37.682200" elapsed="0.050594">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:38.754143" 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-04-25T23:54:38.751746" elapsed="0.002431"/>
</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-04-25T23:54:38.754541" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:38.754386" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:38.754248" elapsed="0.000379"/>
</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-04-25T23:54:38.754977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:38.754715" 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-04-25T23:54:38.755777" level="INFO">${uri} = /restconf/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-04-25T23:54:38.755285" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:38.755058" 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-04-25T23:54:38.756132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:38.755945" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:38.754694" elapsed="0.001516"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:38.756247" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:54:38.756411" level="INFO">${uri} = /restconf/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-04-25T23:54:38.751244" elapsed="0.005193"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:38.756484" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:38.756626" level="INFO">${uri} = /restconf/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-04-25T23:54:38.750743" elapsed="0.005954"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:38.763960" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:38.763701" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:38.764434" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:38.764189" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:38.769640" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:38.766605" elapsed="0.004746">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:38.764544" elapsed="0.006892">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.771621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:38.771470" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:38.764526" elapsed="0.007198">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.772124" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:38.772257" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:38.772220" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:38.772202" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.772466" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:38.772535" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:38.759339" elapsed="0.013304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:38.772732" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:38.756926" elapsed="0.015905">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.773002" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:38.773167" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:38.773230" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:38.736238" elapsed="0.037096">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.773534" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:54:38.735059" elapsed="0.038586">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:38.780991" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:38.784557" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:54:38.733704" elapsed="0.050992">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:39.803853" 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-04-25T23:54:39.801697" elapsed="0.002189"/>
</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-04-25T23:54:39.804239" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:39.804083" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:39.803955" 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-04-25T23:54:39.804697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:39.804395" 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-04-25T23:54:39.805489" level="INFO">${uri} = /restconf/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-04-25T23:54:39.805011" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:39.804780" 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-04-25T23:54:39.805775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:39.805591" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:39.804375" elapsed="0.001479"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:39.805891" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:39.806054" level="INFO">${uri} = /restconf/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-04-25T23:54:39.801201" elapsed="0.004879"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:39.806127" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:39.806271" level="INFO">${uri} = /restconf/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-04-25T23:54:39.800703" elapsed="0.005593"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:39.813905" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:39.813567" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:39.814354" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:39.814108" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:39.819184" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:39.816522" elapsed="0.004398">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:39.814464" elapsed="0.006608">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.821260" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:39.821107" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:39.814446" elapsed="0.006901">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.821748" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:39.821883" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:39.821846" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:39.821829" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.822089" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:39.822158" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:39.809093" elapsed="0.013174">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:39.822342" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-04-25T23:54:39.806514" elapsed="0.015927">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.822626" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:39.822812" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:39.822874" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:39.788153" elapsed="0.034820">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.823137" elapsed="0.000020"/>
</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="FAIL" start="2026-04-25T23:54:39.787099" elapsed="0.036145">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:39.830504" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:39.834100" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:54:39.785738" elapsed="0.048488">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:54:40.853083" 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-04-25T23:54:40.850895" elapsed="0.002248"/>
</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-04-25T23:54:40.853522" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:40.853363" elapsed="0.000216"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:40.853223" elapsed="0.000389"/>
</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-04-25T23:54:40.853973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:40.853704" 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-04-25T23:54:40.854779" level="INFO">${uri} = /restconf/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-04-25T23:54:40.854285" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:40.854056" elapsed="0.000787"/>
</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-04-25T23:54:40.855031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:40.854868" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:40.853681" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:40.855147" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:54:40.855318" level="INFO">${uri} = /restconf/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-04-25T23:54:40.850394" elapsed="0.004949"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:40.855389" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:40.855529" level="INFO">${uri} = /restconf/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-04-25T23:54:40.849880" elapsed="0.005674"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:40.863054" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:40.862788" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:40.863495" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:40.863252" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:40.868390" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:40.865705" elapsed="0.004439">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:40.863604" elapsed="0.006627">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.870417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:40.870266" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:40.863586" elapsed="0.006918">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.870898" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:40.871031" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:40.870994" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:40.870977" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.871231" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:40.871300" 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-04-25T23:54:40.858223" elapsed="0.013328">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:40.871627" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:40.855788" elapsed="0.015957">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.871915" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:40.872081" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:40.872145" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:40.837831" elapsed="0.034412">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.872404" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:54:40.836631" elapsed="0.035882">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:54:40.879900" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:40.883489" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:54:40.835207" elapsed="0.048408">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:54:40.883736" level="FAIL">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:54:30.339012" elapsed="10.544822">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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="FAIL" start="2026-04-25T23:54:30.338597" elapsed="10.545353">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Check that the device is really going to be gone. Fail
if found after one minute. This is an expected behavior as the
delete request is sent to the config subsystem which then triggers
asynchronous destruction of the netconf connector referring to the
device and the device's data. This test makes sure this
asynchronous operation does not take unreasonable amount of time
by making sure that both the netconf connector and the device's
data is gone before reporting success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:54:30.275470" elapsed="10.608674">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:40.885033" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:54:40.884957" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:40.886533" 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-04-25T23:54:40.886216" elapsed="0.000344"/>
</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-04-25T23:54:40.886728" elapsed="0.000315"/>
</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-04-25T23:54:40.886011" elapsed="0.001092"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.222128" level="INFO">[?2004l^C[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-04-25T23:54:40.887258" elapsed="0.335069"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.233885" level="INFO">'testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC.1777161133.802.log' -&gt; '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD-RPC.1777161133.802.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-04-25T23:54:41.222702" elapsed="0.011279"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-04-25T23:54:40.885755" elapsed="0.348335"/>
</kw>
<arg>NetconfKeywords.Stop_Testtool</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:40.885330" elapsed="0.348834"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-25T23:54:40.884737" elapsed="0.349509"/>
</kw>
<doc>netconf-connector CRUD test suite.

Copyright (c) 2017 Lumina Networks, 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 using RPC for node addition and see if
they work.

FIXME: Replace the BuiltIn.Should_[Not_]Contain instances in the test cases
that check the car list related data with calls to keywords of a Resource
aimed at getting interesting pieces of data from the XML files and checking
them against expected data sets. See MDSAL/northbound.robot suite for
additional information.</doc>
<status status="FAIL" start="2026-04-25T23:52:07.665752" elapsed="153.568546"/>
</suite>
<suite id="s1-s4-s2" name="CRUD" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/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-04-25T23:54:41.323592" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:41.319338" elapsed="0.004309"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:54:41.319054" elapsed="0.004684"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.328588" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:54:41.324862" elapsed="0.003754"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:54:41.328862" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:41.328724" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.328693" elapsed="0.000246"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.329467" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:41.329096" elapsed="0.000415"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.330002" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:54:41.329686" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:54:41.330539" elapsed="0.000309"/>
</kw>
<msg time="2026-04-25T23:54:41.330951" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:41.330997" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:41.330193" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.331559" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:41.331188" elapsed="0.000398"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.332585" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:41.332323" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.333026" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:41.332771" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.333570" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.333206" elapsed="0.000393"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.336701" elapsed="0.000234"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.337551" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:41.337181" elapsed="0.000397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.337752" elapsed="0.000238"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.338792" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:41.338478" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:54:41.338864" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:54:41.339032" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:41.338185" elapsed="0.000871"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:41.339834" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfccc64d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:54:41.339213" elapsed="0.000784"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.340159" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-25T23:54:41.336117" elapsed="0.004294"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:41.335922" elapsed="0.004533"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:54:41.333681" elapsed="0.006807"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.341067" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:41.340649" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.341726" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:41.341287" elapsed="0.000482"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.342371" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:41.341929" elapsed="0.000486"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:54:41.331875" elapsed="0.010599"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:54:41.324502" elapsed="0.018027"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:41.342730" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:41.342596" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.342576" 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-04-25T23:54:41.345888" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:41.345491" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.346364" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:41.346070" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:41.346439" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:41.346592" 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-04-25T23:54:41.345138" elapsed="0.001478"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:41.347602" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.347340" elapsed="0.000288"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.348356" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.348458" level="INFO">${current_connection} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.348212" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.352520" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:41.351828" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.351776" elapsed="0.000943"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.353340" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.353670" level="INFO">${current_ssh_connection} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.352996" elapsed="0.000783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.354704" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:41.354050" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.355950" level="INFO">${conn_id} = 47</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.355148" elapsed="0.000908"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.357492" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:54:41.357569" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:54:41.357193" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.357813" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.359234" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:54:41.940881" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:54:41 UTC 2026

  System load:  0.0                Processes:             128
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:52:13 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:54:41.358908" elapsed="0.582150"/>
</kw>
<msg time="2026-04-25T23:54:41.941149" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.358514" elapsed="0.582730"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:54:41.356434" elapsed="0.585063"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.942464" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:54:41.955643" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:54:41.956311" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:54:41.956627" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:54:41.941958" elapsed="0.014935"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:41.957507" elapsed="0.001282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.961293" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:41.960094" elapsed="0.001552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:54:41.962745" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:41.962088" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.961974" elapsed="0.001096"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:54:41.963964" elapsed="0.000140"/>
</return>
<status status="PASS" start="2026-04-25T23:54:41.963368" elapsed="0.000844"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.963279" elapsed="0.001085"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:54:41.964565" 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-04-25T23:54:41.970001" elapsed="0.000164"/>
</kw>
<msg time="2026-04-25T23:54:41.970212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.969222" elapsed="0.001092"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.970562" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.970848" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:41.966066" elapsed="0.004934"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:54:41.350585" elapsed="0.620664"/>
</kw>
<msg time="2026-04-25T23:54:41.971359" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.349803" elapsed="0.621615"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:54:41.349204" elapsed="0.622299"/>
</kw>
<msg time="2026-04-25T23:54:41.971546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.348697" elapsed="0.622896"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:41.975052" elapsed="0.000168"/>
</kw>
<msg time="2026-04-25T23:54:41.975263" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:41.974535" elapsed="0.000789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.975480" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.975641" elapsed="0.000074"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:41.971959" elapsed="0.003820"/>
</kw>
<msg time="2026-04-25T23:54:41.975873" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:54:41.347857" elapsed="0.628041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.976347" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:41.976099" elapsed="0.000289"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:41.976429" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:54:41.346987" elapsed="0.629570"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:41.346810" elapsed="0.629784"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:41.346682" elapsed="0.629954"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:54:41.343020" elapsed="0.633701"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:54:41.976874" elapsed="0.000207"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:41.991038" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:41.990918" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.990897" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.991402" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.991509" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:41.991268" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.991963" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:41.991703" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:41.992395" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:41.992155" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:41.993269" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:54:41.992974" elapsed="0.000416">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:54:41.993502" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:41.993546" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:41.992593" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:41.993903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:41.993645" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:41.993627" elapsed="0.000374"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:41.994753" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.994466" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:41.994826" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:41.994975" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:41.994198" 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-04-25T23:54:41.995149" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:41.995875" level="INFO">index=48
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:41.995767" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:41.996145" elapsed="0.004444"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:42.001040" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:42.002002" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:42.000772" elapsed="0.001681">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:42.006027" elapsed="0.000211"/>
</kw>
<msg time="2026-04-25T23:54:42.006382" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:42.005447" 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-04-25T23:54:42.006605" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:42.006794" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:42.003264" elapsed="0.003613"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:42.002754" elapsed="0.004169"/>
</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="FAIL" start="2026-04-25T23:54:41.990582" elapsed="0.016427">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:43.027543" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:43.027379" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:43.027343" elapsed="0.000323"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:43.028109" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:43.028248" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:43.027900" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:43.028824" level="INFO">{1: 48}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:43.028444" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:43.029413" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:43.029148" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:43.030154" elapsed="0.000232"/>
</kw>
<msg time="2026-04-25T23:54:43.030514" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:43.030575" 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-04-25T23:54:43.029696" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:43.031590" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:43.032535" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:43.032328" elapsed="0.001018">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:43.031992" elapsed="0.001503"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:43.034038" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:43.033697" elapsed="0.000587"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:43.031014" elapsed="0.003323"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:43.030720" elapsed="0.003669"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:43.030696" elapsed="0.003721"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:43.035220" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:43.034942" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:43.035297" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:54:43.035461" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:43.034635" elapsed="0.000852"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:43.035649" elapsed="0.000670"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:43.036888" level="INFO">index=49
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:43.036494" elapsed="0.000534"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:43.037182" elapsed="0.002299"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:43.039944" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:43.041090" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:43.039650" elapsed="0.001832">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:43.045422" elapsed="0.000298"/>
</kw>
<msg time="2026-04-25T23:54:43.045903" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:43.044717" 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-04-25T23:54:43.046140" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:43.046322" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:43.042400" elapsed="0.004008"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:43.041829" elapsed="0.004627"/>
</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="FAIL" start="2026-04-25T23:54:43.026873" elapsed="0.019667">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:44.069929" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:44.069725" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:44.069681" elapsed="0.000376"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:44.070581" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:44.070805" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:44.070340" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:44.071498" level="INFO">{1: 49}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:44.071071" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:44.071959" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:44.071713" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:44.072567" elapsed="0.000206"/>
</kw>
<msg time="2026-04-25T23:54:44.072875" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:44.072920" level="INFO">${old_connection_index} = 49</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:44.072168" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:44.073776" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:44.074690" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:44.074475" elapsed="0.000894">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:44.074151" elapsed="0.001354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:44.076019" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:44.075694" elapsed="0.000529"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:44.073239" elapsed="0.003031"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:44.073018" elapsed="0.003301"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:44.072999" elapsed="0.003346"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:44.077112" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:44.076843" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:44.077185" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:54:44.077342" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:44.076551" 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-04-25T23:54:44.077523" elapsed="0.000457"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:44.078498" level="INFO">index=50
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:44.078149" elapsed="0.000477"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:44.078841" elapsed="0.002220"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:44.081483" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:44.082538" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:44.081223" elapsed="0.001723">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:44.086545" elapsed="0.000268"/>
</kw>
<msg time="2026-04-25T23:54:44.086962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:44.086000" elapsed="0.001081"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:44.087239" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:44.087399" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:44.083798" elapsed="0.003681"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:44.083233" elapsed="0.004293"/>
</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="FAIL" start="2026-04-25T23:54:44.069128" elapsed="0.018478">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.108564" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.108411" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.108381" elapsed="0.000294"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.109045" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:45.109169" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:45.108877" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.109720" level="INFO">{1: 50}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:45.109354" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.110161" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:45.109918" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.110764" elapsed="0.000189"/>
</kw>
<msg time="2026-04-25T23:54:45.111053" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:45.111100" level="INFO">${old_connection_index} = 50</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.110366" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.111971" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.112867" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.112686" elapsed="0.000813">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.112331" elapsed="0.001303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:45.114143" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.113822" elapsed="0.000522"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:45.111443" elapsed="0.002947"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:45.111199" elapsed="0.003240"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.111180" elapsed="0.003285"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:45.115225" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.114958" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:45.115308" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:54:45.115467" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:45.114683" 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-04-25T23:54:45.115664" elapsed="0.000648"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.116592" level="INFO">index=51
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:45.116483" elapsed="0.000312"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.116946" elapsed="0.002197"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.119595" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:45.120944" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.119331" elapsed="0.001990">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.124917" elapsed="0.000211"/>
</kw>
<msg time="2026-04-25T23:54:45.125272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.124362" elapsed="0.000977"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.125503" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.125690" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:45.122156" elapsed="0.003618"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:45.121598" elapsed="0.004222"/>
</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="FAIL" start="2026-04-25T23:54:45.107988" elapsed="0.017913">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:45.125990" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:54:41.977827" elapsed="3.148253">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:41.977438" elapsed="3.148707"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:41.977299" elapsed="3.148888"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:54:41.977143" elapsed="3.149079"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:54:41.324058" elapsed="3.802222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.128957" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.128848" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.128830" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.133817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.133709" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.133690" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.135007" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:45.134599" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.135511" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:45.135192" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:45.135580" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:45.135752" 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-04-25T23:54:45.134271" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.141203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.141097" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.141078" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.142634" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.142455" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.142435" elapsed="0.000406"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:45.143419" level="INFO">${karaf_connection_index} = 51</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.142988" elapsed="0.000472"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.143955" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.143711" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.146020" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.145589" elapsed="0.000930">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:45.146697" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:45.146772" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.144220" elapsed="0.002590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.148911" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.148485" elapsed="0.000979">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:45.149624" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:45.149713" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.147062" elapsed="0.002691"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.150868" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.150238" elapsed="0.000804">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:45.149916" elapsed="0.001260">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:45.149895" elapsed="0.001332">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.151404" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.151799" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:45.151556" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:45.151537" elapsed="0.000432"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.152002" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.154301" elapsed="0.000146"/>
</kw>
<msg time="2026-04-25T23:54:45.154490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.153853" elapsed="0.000699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.154776" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.154981" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:45.153155" elapsed="0.001989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:45.152256" elapsed="0.002982"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.142103" elapsed="0.013243">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</status>
</kw>
<msg time="2026-04-25T23:54:45.155451" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:45.155495" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/CRUD.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.141418" elapsed="0.014101"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.155885" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.155596" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.155577" elapsed="0.000375"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.156963" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.156855" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.156836" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.157289" level="INFO">index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:45.157391" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:45.157179" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.157861" level="INFO">{1: 51}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:45.157567" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.158317" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:45.158056" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.158893" elapsed="0.000353"/>
</kw>
<msg time="2026-04-25T23:54:45.159425" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:45.159473" level="INFO">${old_connection_index} = 51</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.158521" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.160755" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.162167" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.162012" elapsed="0.000582">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.161335" elapsed="0.001361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:45.163650" elapsed="0.000192"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.162965" elapsed="0.000946"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:45.159884" elapsed="0.004106"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:45.159572" elapsed="0.004469"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.159553" elapsed="0.004513"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:45.165065" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.164563" elapsed="0.000529"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:45.165177" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:45.165332" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:45.164265" elapsed="0.001092"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.165515" elapsed="0.000469"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.166258" level="INFO">index=52
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:45.166152" 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-04-25T23:54:45.166537" elapsed="0.013696"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.180715" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:45.181623" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.180396" elapsed="0.001609">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:45.186626" elapsed="0.000166"/>
</kw>
<msg time="2026-04-25T23:54:45.186864" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.185466" elapsed="0.001511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.187271" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.187609" elapsed="0.000340"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:45.182850" elapsed="0.005200"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:45.182275" elapsed="0.005822"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.156414" elapsed="0.031765">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.188555" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:45.188631" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:45.140808" elapsed="0.047944">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:45.188857" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:45.188900" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.136151" elapsed="0.052772"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:45.189247" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:45.188998" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.188980" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:45.136009" elapsed="0.053337"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:45.135834" elapsed="0.053541"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:45.133400" elapsed="0.056027"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:54:45.126914" elapsed="0.062567"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:45.126435" elapsed="0.063086"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:54:41.318709" elapsed="3.870862"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:45.190021" level="INFO">Creating Session using : alias=operational, url=http://10.30.170.206:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc23c810&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>operational</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${REST_API}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:54:45.189737" elapsed="0.000453"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.190992" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.190717" elapsed="0.000301"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.194917" 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-04-25T23:54:45.191172" elapsed="0.003789"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:45.199254" level="INFO">Creating Session using : alias=default, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfcd03990&gt;, timeout=2, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:54:45.198895" elapsed="0.000478"/>
</kw>
<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="PASS" start="2026-04-25T23:54:45.198472" elapsed="0.000968"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:45.195030" elapsed="0.004441"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.195012" elapsed="0.004484"/>
</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-04-25T23:54:45.204554" 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-04-25T23:54:45.204187" elapsed="0.000394"/>
</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-04-25T23:54:45.206256" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:54:45.206332" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:54:45.205989" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.206509" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.207875" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:54:45.578719" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:54:41 UTC 2026

  System load:  0.0                Processes:             128
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:54:41 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:54:45.207370" elapsed="0.371494"/>
</kw>
<msg time="2026-04-25T23:54:45.578948" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.207006" elapsed="0.372027"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:54:45.205501" elapsed="0.373650"/>
</kw>
<msg time="2026-04-25T23:54:45.579204" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.205104" elapsed="0.374149"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:54:45.204777" elapsed="0.374555"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:54:45.579383" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:54:45.579626" level="INFO">${odl} = 53</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-04-25T23:54:45.203897" elapsed="0.375769"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.588827" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:54:45.597292" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:54:45.579890" elapsed="0.017538"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:45.597837" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-25T23:54:45.598927" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:45.598590" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:45.598541" elapsed="0.000531"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.608078" level="INFO">${tools_connection} = 54</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:45.607495" elapsed="0.000621"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:54:45.610504" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:54:45.610612" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:54:45.610115" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.610886" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:54:45.612587" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:54:46.173350" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:54:45 UTC 2026

  System load:  0.03               Processes:             109
  Usage of /:   20.9% of 38.58GB   Users logged in:       1
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

115 updates can be applied immediately.
94 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

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

New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Apr 25 23:52:12 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:54:45.612136" elapsed="0.561320"/>
</kw>
<msg time="2026-04-25T23:54:46.173527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.611607" elapsed="0.561987"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:54:45.609482" elapsed="0.564307"/>
</kw>
<msg time="2026-04-25T23:54:46.173840" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:45.608879" elapsed="0.565009"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-25T23:54:45.608385" elapsed="0.565577"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-25T23:54:46.174003" elapsed="0.000035"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:54:45.606985" elapsed="0.567166"/>
</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-04-25T23:54:45.199769" elapsed="0.974438"/>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-04-25T23:54:45.190444" elapsed="0.983821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.174916" level="INFO">${device_type} = full-uri-device</msg>
<var>${device_type}</var>
<arg>"""${USE_NETCONF_CONNECTOR}""" == """True"""</arg>
<arg>default</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:46.174448" elapsed="0.000495"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.175429" level="INFO">${device_type} = full-uri-device</msg>
<arg>${device_type}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:54:46.175116" elapsed="0.000354"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-04-25T23:54:41.318265" elapsed="4.857264"/>
</kw>
<test id="s1-s4-s2-t1" name="Start_Testtool" line="45">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:46.178910" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:46.178617" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.180224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.180106" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.180086" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.185157" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.185049" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.185031" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.186232" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:46.185845" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.186748" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:46.186418" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:46.186817" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:46.186970" 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-04-25T23:54:46.185454" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.192632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.192522" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.192500" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.193940" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.193833" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.193815" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:46.194534" level="INFO">${karaf_connection_index} = 52</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:46.194160" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.195005" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:46.194750" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.195900" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.195576" elapsed="0.001301">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:46.197059" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:46.197105" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.195186" elapsed="0.001974"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.198016" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.197737" elapsed="0.001342">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:46.199255" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:46.199301" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.197328" elapsed="0.001996"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.200298" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.199620" elapsed="0.000759">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:46.199400" elapsed="0.001077">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:46.199381" elapsed="0.001132">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.200688" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.200917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:46.200777" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:46.200760" elapsed="0.000260"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.201052" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:46.204184" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:54:46.204406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.203393" elapsed="0.001106"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.205407" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.206349" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:46.201929" elapsed="0.004533"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:46.201332" elapsed="0.005248"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.193512" elapsed="0.013192">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</status>
</kw>
<msg time="2026-04-25T23:54:46.206811" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:46.206855" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Start_Testtool"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.192867" elapsed="0.014011"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.207062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.206955" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.206936" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.208213" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.208102" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.208084" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.208557" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:46.208675" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:46.208433" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.209115" level="INFO">{1: 52}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.208853" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.209548" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.209308" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:46.210119" elapsed="0.000328"/>
</kw>
<msg time="2026-04-25T23:54:46.210583" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:46.210633" level="INFO">${old_connection_index} = 52</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.209762" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:46.211484" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.213763" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.213330" elapsed="0.000968">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.212083" elapsed="0.002294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:46.215918" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.214609" elapsed="0.001731"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:46.210983" elapsed="0.005459"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:46.210761" elapsed="0.005732"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.210742" elapsed="0.005776"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:46.217464" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:46.217057" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:46.217543" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:46.217707" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:46.216736" 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-04-25T23:54:46.217884" elapsed="0.000414"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.218571" level="INFO">index=55
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:46.218464" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:46.218880" elapsed="0.002355"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.221675" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:46.222747" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.221396" elapsed="0.001724">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:46.233423" elapsed="0.000338"/>
</kw>
<msg time="2026-04-25T23:54:46.233820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.232146" elapsed="0.001760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.234229" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.234487" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:46.224034" elapsed="0.010592"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:46.223390" elapsed="0.011318"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.207781" elapsed="0.027014">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.235125" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.235198" elapsed="0.000048"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.192177" elapsed="0.043161">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:46.235442" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:46.235485" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.187393" elapsed="0.048114"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.236084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:46.235583" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.235565" elapsed="0.000597"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:46.187246" elapsed="0.048938"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:46.187057" elapsed="0.049161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:46.184693" elapsed="0.051580"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:46.179797" elapsed="0.056528"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:46.179327" elapsed="0.057042"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:46.176227" elapsed="0.060193"/>
</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-04-25T23:54:46.256834" 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-04-25T23:54:46.256515" elapsed="0.000346"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.257351" 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-04-25T23:54:46.257021" elapsed="0.000356"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.257939" 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-04-25T23:54:46.257539" elapsed="0.000426"/>
</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-04-25T23:54:46.259206" elapsed="0.000305"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-25T23:54:46.259906" 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-04-25T23:54:46.259690" elapsed="0.000243"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.260482" 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-04-25T23:54:46.260093" elapsed="0.000415"/>
</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-04-25T23:54:46.280936" elapsed="0.000405"/>
</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-04-25T23:54:46.280458" elapsed="0.000953"/>
</kw>
<msg time="2026-04-25T23:54:46.281457" 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-04-25T23:54:46.269928" elapsed="0.011578"/>
</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-04-25T23:54:46.269522" elapsed="0.012058"/>
</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-04-25T23:54:46.300032" elapsed="0.000401"/>
</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-04-25T23:54:46.299552" elapsed="0.000950"/>
</kw>
<msg time="2026-04-25T23:54:46.300548" 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-04-25T23:54:46.291014" elapsed="0.009581"/>
</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-04-25T23:54:46.290612" elapsed="0.010114"/>
</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-04-25T23:54:46.319050" elapsed="0.000399"/>
</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-04-25T23:54:46.318583" elapsed="0.000936"/>
</kw>
<msg time="2026-04-25T23:54:46.319564" 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-04-25T23:54:46.310119" elapsed="0.009493"/>
</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-04-25T23:54:46.309735" elapsed="0.009969"/>
</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-04-25T23:54:46.322721" elapsed="0.000258"/>
</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-04-25T23:54:46.323481" elapsed="0.000189"/>
</kw>
<msg time="2026-04-25T23:54:46.323718" 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-04-25T23:54:46.323139" elapsed="0.000628"/>
</kw>
<msg time="2026-04-25T23:54:46.323870" 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-04-25T23:54:46.322361" elapsed="0.001533"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.324173" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:46.324270" level="INFO">${current_ssh_connection} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:46.324064" elapsed="0.000232"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.329267" 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-04-25T23:54:46.328898" elapsed="0.000395"/>
</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-04-25T23:54:46.331037" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:54:46.331113" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:54:46.330738" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.331290" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.332955" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:54:46.659271" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:54:41 UTC 2026

  System load:  0.0                Processes:             128
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:54:45 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:54:46.332216" elapsed="0.327165"/>
</kw>
<msg time="2026-04-25T23:54:46.659492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.331850" elapsed="0.327708"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:54:46.330245" elapsed="0.329420"/>
</kw>
<msg time="2026-04-25T23:54:46.659772" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.329861" elapsed="0.329962"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:54:46.329472" elapsed="0.330428"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:54:46.659942" elapsed="0.000036"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:54:46.328539" elapsed="0.331551"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.660549" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.3-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-04-25T23:54:46.694028" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:46.694165" level="INFO">${version} = 9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-04-25T23:54:46.694212" 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-04-25T23:54:46.660293" elapsed="0.033943"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:46.694425" elapsed="0.000323"/>
</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-04-25T23:54:46.698420" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:54:46.698614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:46.697760" elapsed="0.000925"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.698848" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:46.699008" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:46.695027" elapsed="0.004063"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.699496" level="INFO">9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.699241" elapsed="0.000298"/>
</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-04-25T23:54:46.699861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:46.699621" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.699596" elapsed="0.000345"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-04-25T23:54:46.700353" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:54:46.700398" 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-04-25T23:54:46.700084" elapsed="0.000336"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-04-25T23:54:46.700469" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:46.700683" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:54:46.700728" 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-04-25T23:54:46.321946" elapsed="0.378805"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:46.319777" elapsed="0.381018"/>
</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-04-25T23:54:46.700973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:46.700821" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.319758" elapsed="0.381296"/>
</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-04-25T23:54:46.701327" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:46.701111" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.701095" elapsed="0.000503"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.702143" 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-04-25T23:54:46.701763" elapsed="0.000406"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.702731" 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-04-25T23:54:46.702333" elapsed="0.000424"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.703307" 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-04-25T23:54:46.702919" elapsed="0.000414"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.703874" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-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-04-25T23:54:46.703491" 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-04-25T23:54:46.706462" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-04-25T23:54:46.790365" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:46.790642" 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;2026042...</msg>
<msg time="2026-04-25T23:54:46.790808" 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-04-25T23:54:46.790902" 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-04-25T23:54:46.706193" elapsed="0.084759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.792829" level="INFO">Length is 316.</msg>
<msg time="2026-04-25T23:54:46.793019" 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  42327      0 --:--:-- --:--:-- --:--:-- 42507' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-25T23:54:46.792149" elapsed="0.001017">'  % 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  42327      0 --:--:-- --:--:-- --:--:-- 42507' should be empty.</status>
</kw>
<msg time="2026-04-25T23:54:46.793397" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-25T23:54:46.793493" 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-04-25T23:54:46.791349" elapsed="0.002196"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.794891" 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-04-25T23:54:46.793940" 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-04-25T23:54:46.797356" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:54:46.796813" elapsed="0.000717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.798410" 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  42327      0 --:--:-- --:--:-- --:--:-- 42507</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.797886" elapsed="0.000624"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.799488" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.798963" elapsed="0.000620"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-25T23:54:46.795881" elapsed="0.003850"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:46.795114" elapsed="0.004698"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.795073" elapsed="0.004794"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.800254" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.799992" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.799954" elapsed="0.000448"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:54:46.800705" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-25T23:54:46.800522" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.800485" elapsed="0.000342"/>
</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-04-25T23:54:46.801037" elapsed="0.000031"/>
</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-04-25T23:54:46.705197" elapsed="0.096014"/>
</kw>
<msg time="2026-04-25T23:54:46.801311" 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-04-25T23:54:46.704567" elapsed="0.096814"/>
</kw>
<msg time="2026-04-25T23:54:46.801612" 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;2026042...</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-04-25T23:54:46.704166" elapsed="0.097507"/>
</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-04-25T23:54:46.805443" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:54:46.846053" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:46.846299" level="INFO">${stdout} = 9.0.3-20260425.052634-49</msg>
<msg time="2026-04-25T23:54:46.846397" level="INFO">${stderr} = </msg>
<msg time="2026-04-25T23:54:46.846487" 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-04-25T23:54:46.805178" elapsed="0.041358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.848328" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-25T23:54:46.847734" elapsed="0.000690"/>
</kw>
<msg time="2026-04-25T23:54:46.848732" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-25T23:54:46.848830" 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-04-25T23:54:46.846968" elapsed="0.001911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.850273" 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-04-25T23:54:46.849242" elapsed="0.001089"/>
</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-04-25T23:54:46.852773" level="INFO">9.0.3-20260425.052634-49</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.852163" elapsed="0.000676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.853442" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.853060" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.854167" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.853787" 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-04-25T23:54:46.851265" elapsed="0.003044"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:46.850500" elapsed="0.003862"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.850458" elapsed="0.003941"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.854625" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.854480" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.854456" elapsed="0.000292"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:54:46.854955" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-25T23:54:46.854824" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.854801" 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-04-25T23:54:46.855282" elapsed="0.000031"/>
</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-04-25T23:54:46.804275" elapsed="0.051178"/>
</kw>
<msg time="2026-04-25T23:54:46.855529" 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-04-25T23:54:46.803460" elapsed="0.052138"/>
</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-04-25T23:54:46.802782" elapsed="0.052953"/>
</kw>
<msg time="2026-04-25T23:54:46.855877" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:46.855940" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:54:46.801913" elapsed="0.054060"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.856610" level="INFO">Length is 24.</msg>
<msg time="2026-04-25T23:54:46.856740" 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-04-25T23:54:46.856224" elapsed="0.000551"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.857588" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:54:46.857010" elapsed="0.000616"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.858409" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:54:46.857906" elapsed="0.000541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.859054" level="INFO">netconf-testtool-9.0.3-20260425.052634-49-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.858695" elapsed="0.000422"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.859819" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:54:46.859335" elapsed="0.000524"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.860370" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:54:46.918532" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:46.918817" level="INFO">${response} = </msg>
<msg time="2026-04-25T23:54:46.918919" 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-04-25T23:54:46.860092" elapsed="0.058876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.920020" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.919424" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:54:46.920538" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-25T23:54:46.920291" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.920218" elapsed="0.000545"/>
</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-04-25T23:54:46.921090" elapsed="0.000048"/>
</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-04-25T23:54:46.921557" elapsed="0.000060"/>
</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-04-25T23:54:46.922141" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:46.921829" elapsed="0.000427"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:46.921789" elapsed="0.000517"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.922376" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:46.922738" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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.3-SNAPSHOT/netconf-karaf-9.0.3-20260425.052634-49.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-04-25T23:54:46.258543" elapsed="0.664253"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:54:46.922945" elapsed="0.000060"/>
</return>
<msg time="2026-04-25T23:54:46.923271" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:54:46.250753" elapsed="0.672572"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:46.925986" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:54:46.969924" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:46.970141" 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-04-25T23:54:46.925848" elapsed="0.044348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:46.971188" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:46.970561" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-25T23:54:46.972132" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:46.971430" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:46.971386" elapsed="0.000937"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:54:47.019211" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:54:47.123398" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-04-25T23:54:47.123458" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-04-25T23:54:47.123498" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:54:47.123533" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:54:47.123569" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-04-25T23:54:47.123606" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:47.123641" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:47.123704" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:47.123742" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:54:47.123828" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-04-25T23:54:47.123868" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:54:47.123904" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:47.123939" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:46.972692" elapsed="0.151314"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:54:47.128793" 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-04-25T23:54:47.124242" elapsed="0.004631"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-04-25T23:54:47.128938" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:54:47.129127" 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-04-25T23:54:46.925377" elapsed="0.203786"/>
</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-04-25T23:54:47.130054" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-25T23:54:47.129900" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:47.129874" elapsed="0.000298"/>
</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-04-25T23:54:47.130435" elapsed="0.000033"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="NOT RUN" start="2026-04-25T23:54:47.130540" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:47.133367" 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-04-25T23:54:47.129496" elapsed="0.003907"/>
</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-04-25T23:54:47.135323" elapsed="0.000472"/>
</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-04-25T23:54:47.136027" elapsed="0.000442"/>
</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-04-25T23:54:47.136716" elapsed="0.000425"/>
</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-04-25T23:54:47.138873" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:54:47.151493" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:47.151765" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jan 22 23:45 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-04-25T23:54:47.151868" 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-04-25T23:54:47.138610" elapsed="0.013308"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-04-25T23:54:47.152330" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-04-25T23:54:47.152095" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:47.152051" elapsed="0.000494"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-04-25T23:54:47.152620" elapsed="0.000061"/>
</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-04-25T23:54:47.138066" elapsed="0.014833"/>
</kw>
<msg time="2026-04-25T23:54:47.152994" 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-04-25T23:54:47.137365" elapsed="0.015736"/>
</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-04-25T23:54:47.153471" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-04-25T23:54:47.153793" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:47.153709" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:47.153643" elapsed="0.000285"/>
</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-04-25T23:54:47.154320" 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-04-25T23:54:47.154730" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:54:47.155012" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:47.154934" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:47.154897" elapsed="0.000251"/>
</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-04-25T23:54:47.155458" elapsed="0.000044"/>
</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-04-25T23:54:47.155887" 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-04-25T23:54:47.156280" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:54:47.156629" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:47.156550" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:47.156510" elapsed="0.000291"/>
</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-04-25T23:54:47.157106" elapsed="0.000045"/>
</kw>
<msg time="2026-04-25T23:54:47.157373" 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-04-25T23:54:47.134813" elapsed="0.022616"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.158171" 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.3-20260425.052634-49-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-04-25T23:54:47.157707" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.158785" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:54:47.158424" elapsed="0.000424"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-04-25T23:54:47.158906" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:54:47.159118" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:54:47.133745" elapsed="0.025409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.159733" 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.3-20260425.052634-49-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-04-25T23:54:47.159369" elapsed="0.000427"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.163992" level="INFO">${name} = netconf-gate-userfeatures-netty-txt-CRUD-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-04-25T23:54:47.163467" elapsed="0.000563"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.166609" 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-04-25T23:54:47.164255" elapsed="0.002381"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.167005" level="INFO">${date} = 2026-04-25 23:54:47.167</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:54:47.166824" elapsed="0.000206"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.167491" level="INFO">${timestamp} = 1777161287.167</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-04-25T23:54:47.167181" elapsed="0.000336"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-04-25T23:54:47.167564" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:47.167834" level="INFO">${logfile} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD.1777161287.167.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-04-25T23:54:47.160112" elapsed="0.007748"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.172520" level="INFO">${testtool_log} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD.1777161287.167.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-04-25T23:54:47.168025" elapsed="0.004543"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:47.193856" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas  --md-sal true &gt;testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD.1777161287.167.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-04-25T23:54:47.172777" elapsed="0.021144"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.198023" 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-04-25T23:54:47.194092" elapsed="0.003976"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.198890" level="INFO">${current_Date} = 2026-04-25 23:54:47.199</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:54:47.198733" elapsed="0.000184"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.199403" level="INFO">${deadline_Date} = 2026-04-26 00:39:47.199</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-04-25T23:54:47.199068" elapsed="0.000361"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.204005" 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-04-25T23:54:47.199592" elapsed="0.004458"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.204573" 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-04-25T23:54:47.205704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:47.205579" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:47.205561" elapsed="0.000206"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.206066" level="INFO">${current_Date} = 2026-04-25 23:54:47.206</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:54:47.205911" elapsed="0.000181"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-04-25T23:54:47.206553" 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-04-25T23:54:47.206240" elapsed="0.000338"/>
</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-04-25T23:54:47.206912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:47.206649" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:47.206631" elapsed="0.000358"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-04-25T23:54:47.205343" elapsed="0.001691"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.207544" 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-04-25T23:54:47.207179" elapsed="0.000394"/>
</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-04-25T23:54:47.209010" 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-04-25T23:54:47.208668" elapsed="0.000369"/>
</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-04-25T23:54:47.210820" 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-04-25T23:54:47.210069" elapsed="0.000777"/>
</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-04-25T23:54:47.213731" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:54:47.227122" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:47.227343" 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-04-25T23:54:47.213617" elapsed="0.013783"/>
</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-04-25T23:54:47.228328" elapsed="0.000055"/>
</kw>
<msg time="2026-04-25T23:54:47.228510" 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-04-25T23:54:47.227567" elapsed="0.001054">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-04-25T23:54:47.227518" elapsed="0.001296">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-04-25T23:54:47.213343" elapsed="0.015764">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-04-25T23:54:47.212732" elapsed="0.016576"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:47.230852" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:54:47.281713" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:47.282131" 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-04-25T23:54:47.230138" elapsed="0.052065"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:47.282368" elapsed="0.000119"/>
</return>
<msg time="2026-04-25T23:54:47.283101" 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-04-25T23:54:47.211604" elapsed="0.071586"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:54:47.285459" 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-04-25T23:54:47.283801" elapsed="0.002010">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:54:47.211023" elapsed="0.075140">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-04-25T23:54:47.209751" elapsed="0.076625">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:48.290123" 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-04-25T23:54:48.288252" elapsed="0.001942"/>
</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-04-25T23:54:48.295468" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:54:48.309032" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:48.309186" 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-04-25T23:54:48.295308" elapsed="0.013915"/>
</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-04-25T23:54:48.310039" elapsed="0.000057"/>
</kw>
<msg time="2026-04-25T23:54:48.310177" 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-04-25T23:54:48.309355" elapsed="0.001076">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-04-25T23:54:48.309313" elapsed="0.001222">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-04-25T23:54:48.294915" elapsed="0.015947">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-04-25T23:54:48.294175" elapsed="0.016894"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:48.312463" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:54:48.358267" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:48.358744" 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-04-25T23:54:48.311807" elapsed="0.047016"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:48.359002" elapsed="0.000131"/>
</return>
<msg time="2026-04-25T23:54:48.359778" 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-04-25T23:54:48.292035" elapsed="0.067834"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:54:48.362145" 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-04-25T23:54:48.360427" elapsed="0.002011">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:54:48.290616" elapsed="0.072723">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-04-25T23:54:48.287252" elapsed="0.076314">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:49.367502" 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-04-25T23:54:49.365645" elapsed="0.001928"/>
</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-04-25T23:54:49.374023" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:54:49.388113" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:49.388341" 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-04-25T23:54:49.373774" elapsed="0.014626"/>
</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-04-25T23:54:49.389389" elapsed="0.000057"/>
</kw>
<msg time="2026-04-25T23:54:49.389558" 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-04-25T23:54:49.388590" elapsed="0.001240">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-04-25T23:54:49.388534" elapsed="0.001405">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-04-25T23:54:49.373074" elapsed="0.017163">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-04-25T23:54:49.371919" elapsed="0.018528"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:49.391989" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:54:49.438142" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:49.438567" 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-04-25T23:54:49.391193" elapsed="0.047451"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:49.438882" elapsed="0.000133"/>
</return>
<msg time="2026-04-25T23:54:49.439606" 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-04-25T23:54:49.369404" elapsed="0.070359"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:54:49.442042" 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-04-25T23:54:49.440333" elapsed="0.001998">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:54:49.368056" elapsed="0.074655">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-04-25T23:54:49.364559" elapsed="0.078373">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:50.447026" 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-04-25T23:54:50.445081" elapsed="0.002016"/>
</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-04-25T23:54:50.454162" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:54:50.477585" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:50.477853" 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-04-25T23:54:50.453284" elapsed="0.024630"/>
</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-04-25T23:54:50.478939" elapsed="0.000057"/>
</kw>
<msg time="2026-04-25T23:54:50.479077" 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-04-25T23:54:50.478141" elapsed="0.001142">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-04-25T23:54:50.478045" elapsed="0.001341">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-04-25T23:54:50.452628" elapsed="0.027095">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-04-25T23:54:50.451347" elapsed="0.028596"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:50.481338" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:54:50.566253" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:50.566782" 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-04-25T23:54:50.480640" elapsed="0.086223"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:50.567049" elapsed="0.000143"/>
</return>
<msg time="2026-04-25T23:54:50.567854" 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-04-25T23:54:50.448912" elapsed="0.119035"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:54:50.570272" 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-04-25T23:54:50.568531" elapsed="0.002038">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:54:50.447514" elapsed="0.123451">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-04-25T23:54:50.444004" elapsed="0.127177">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.574895" 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-04-25T23:54:51.573068" elapsed="0.001897"/>
</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-04-25T23:54:51.580817" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:54:51.594250" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:51.594397" 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-04-25T23:54:51.580636" elapsed="0.013798"/>
</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-04-25T23:54:51.595088" elapsed="0.000037"/>
</kw>
<msg time="2026-04-25T23:54:51.595176" 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-04-25T23:54:51.594561" 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>
</branch>
<status status="FAIL" start="2026-04-25T23:54:51.594520" elapsed="0.000869">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-04-25T23:54:51.580242" elapsed="0.015344">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-04-25T23:54:51.579395" elapsed="0.016343"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.596585" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:54:51.645928" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:54:51.646354" 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-04-25T23:54:51.596179" elapsed="0.050246"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:54:51.646598" elapsed="0.000199"/>
</return>
<msg time="2026-04-25T23:54:51.647379" 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-04-25T23:54:51.576821" elapsed="0.070647"/>
</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-04-25T23:54:51.648079" elapsed="0.001496"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-04-25T23:54:51.575379" elapsed="0.074481"/>
</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-04-25T23:54:51.572076" elapsed="0.077897"/>
</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-04-25T23:54:47.209198" elapsed="4.440877"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:54:47.208199" elapsed="4.442005"/>
</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-04-25T23:54:47.207743" elapsed="4.442563"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.651486" 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-04-25T23:54:51.650680" elapsed="0.000865"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.652407" 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-04-25T23:54:51.651851" elapsed="0.000613"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:54:47.204789" elapsed="4.447760"/>
</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-04-25T23:54:47.204214" elapsed="4.448408"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:54:47.198264" elapsed="4.454472"/>
</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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:54:46.923950" elapsed="4.728869"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/schemas</arg>
<arg>mdsal=true</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-04-25T23:54:46.236632" elapsed="5.416343"/>
</kw>
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="PASS" start="2026-04-25T23:54:46.175602" elapsed="5.477546"/>
</test>
<test id="s1-s4-s2-t2" name="Check_Device_Is_Not_Configured_At_Beginning" line="52">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:51.658548" elapsed="0.000355"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:51.658184" elapsed="0.000798"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.660197" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.660084" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.660064" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.665225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.665120" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.665102" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.666293" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:51.665911" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.666820" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:51.666477" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:51.666890" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:51.667044" 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-04-25T23:54:51.665521" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.672484" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.672377" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.672357" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.673780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.673649" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.673631" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:51.674354" level="INFO">${karaf_connection_index} = 55</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.673991" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.674835" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.674540" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.675822" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.675402" elapsed="0.001373">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:51.676957" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:51.677003" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.675018" elapsed="0.002008"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.677887" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.677586" elapsed="0.001343">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:51.679105" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:51.679151" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.677194" elapsed="0.001980"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.680090" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.679465" elapsed="0.000737">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:51.679247" elapsed="0.001051">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:51.679228" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.680492" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.680732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.680578" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:51.680561" elapsed="0.000267"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.680861" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.683908" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:54:51.684128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.683223" elapsed="0.000999"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.685226" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.686170" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.681728" elapsed="0.004556"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:51.681136" elapsed="0.005261"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.673344" elapsed="0.013139">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<msg time="2026-04-25T23:54:51.686584" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:51.686627" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.672712" elapsed="0.013939"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.686867" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.686759" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.686740" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.687729" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.687609" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.687592" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.688074" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:51.688175" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:51.687949" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.688602" level="INFO">{1: 55}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.688347" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.689164" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.688923" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.689731" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:54:51.690150" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:51.690195" level="INFO">${old_connection_index} = 55</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.689360" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.691058" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.693323" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.692760" elapsed="0.001124">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.691452" elapsed="0.002543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:51.695486" elapsed="0.000372"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.694230" elapsed="0.001691"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:51.690512" elapsed="0.005510"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:51.690295" elapsed="0.005778"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.690274" elapsed="0.005824"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:51.697140" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.696616" elapsed="0.000550"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:51.697214" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:51.697363" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.696298" elapsed="0.001088"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.697536" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.698246" level="INFO">index=57
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:51.698140" elapsed="0.000229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.698513" elapsed="0.002356"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.701292" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:51.702270" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.701031" elapsed="0.001606">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.713172" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:54:51.713548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.711876" 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-04-25T23:54:51.714103" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.714360" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.703455" elapsed="0.011043"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:51.702933" elapsed="0.011613"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.687322" elapsed="0.027305">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.715020" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.715092" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.672044" elapsed="0.043151">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:51.715299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:51.715342" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.667465" elapsed="0.047899"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.715703" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.715441" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.715423" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:51.667321" elapsed="0.048518"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:51.667128" elapsed="0.048744"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:51.664763" elapsed="0.051163"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:51.659789" elapsed="0.056197"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.659188" elapsed="0.056843"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:51.654615" elapsed="0.061468"/>
</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-04-25T23:54:51.728874" 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-04-25T23:54:51.726792" elapsed="0.002109"/>
</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-04-25T23:54:51.729221" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:51.729071" elapsed="0.000206"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.728953" elapsed="0.000350"/>
</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-04-25T23:54:51.729598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.729363" 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-04-25T23:54:51.730389" level="INFO">${uri} = /restconf/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-04-25T23:54:51.729922" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:51.729692" 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-04-25T23:54:51.730636" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.730476" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.729346" elapsed="0.001404"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:51.730787" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:51.730940" level="INFO">${uri} = /restconf/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-04-25T23:54:51.726316" elapsed="0.004649"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:51.731011" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:51.731151" level="INFO">${uri} = /restconf/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-04-25T23:54:51.725832" elapsed="0.005344"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.738323" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.738075" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.738791" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.738516" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:51.743756" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.740938" elapsed="0.004521">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:51.738900" elapsed="0.006646">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.745770" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.745583" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:51.738882" elapsed="0.006978">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.746311" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.746445" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.746408" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:51.746390" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.746649" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.746765" 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-04-25T23:54:51.733805" elapsed="0.013072">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.746948" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:51.731394" elapsed="0.015647">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.747214" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:51.747380" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.747442" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:54:51.716705" elapsed="0.030832">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.747713" elapsed="0.000021"/>
</kw>
<arg>${device_name}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.716292" elapsed="0.031530">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:54:51.653769" elapsed="0.094206">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t3" name="Configure_Device_On_Netconf" line="57">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:51.751562" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:51.751302" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.752877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.752763" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.752744" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.757829" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.757722" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.757704" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.758905" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:51.758492" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.759382" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:51.759090" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:51.759451" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:54:51.759608" 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-04-25T23:54:51.758120" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.765138" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.765031" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.765012" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.766413" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.766308" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.766290" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:51.767321" level="INFO">${karaf_connection_index} = 57</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.766618" elapsed="0.000735"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.767794" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.767524" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.768641" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.768371" elapsed="0.001318">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:51.769875" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:51.769921" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.767977" elapsed="0.001968"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.770821" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.770502" elapsed="0.001351">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:51.772029" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:51.772074" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.770112" elapsed="0.001985"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.773019" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.772389" elapsed="0.000709">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:51.772172" elapsed="0.001018">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:51.772152" elapsed="0.001072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.773382" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.773605" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.773467" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:51.773450" elapsed="0.000264"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.773746" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.776944" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:54:51.777168" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.776296" 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-04-25T23:54:51.778255" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.779234" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.774591" elapsed="0.004755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:51.774011" elapsed="0.005448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.766007" elapsed="0.013537">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</status>
</kw>
<msg time="2026-04-25T23:54:51.779645" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:51.779799" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_Device_On_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.765353" elapsed="0.014509"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.780051" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.779943" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.779923" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.780916" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:51.780812" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.780793" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.781257" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:51.781359" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:51.781132" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.781816" level="INFO">{1: 57}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.781535" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.782248" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.782008" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.782828" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:54:51.783244" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:51.783289" level="INFO">${old_connection_index} = 57</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.782445" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.784238" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.786475" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.785909" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.784633" elapsed="0.002493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:51.788738" elapsed="0.000353"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.787362" elapsed="0.001792"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:51.783607" elapsed="0.005648"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:51.783388" elapsed="0.005918"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.783368" elapsed="0.005963"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:51.790270" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.789868" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:51.790344" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:51.790494" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.789532" elapsed="0.000986"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.790684" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.791393" level="INFO">index=58
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:51.791285" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.791688" elapsed="0.002231"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:51.794341" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:51.795317" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.794082" elapsed="0.001733">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:51.805921" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:54:51.806296" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.804578" elapsed="0.001805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.806726" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.807000" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:51.796627" elapsed="0.010514"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:51.796120" elapsed="0.011074"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.780504" elapsed="0.026772">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.807606" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.807731" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.764695" elapsed="0.043143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:51.807941" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:51.807984" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.760058" elapsed="0.047948"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.808332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.808082" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.808064" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:51.759917" elapsed="0.048515"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:51.759738" elapsed="0.048724"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:51.757347" elapsed="0.051168"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:51.752459" elapsed="0.056110"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:51.752015" elapsed="0.056598"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:51.748906" elapsed="0.059807"/>
</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-04-25T23:54:51.828604" elapsed="0.000436"/>
</kw>
<msg time="2026-04-25T23:54:51.829091" 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-04-25T23:54:51.828247" 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-04-25T23:54:51.827859" elapsed="0.001355"/>
</kw>
<msg time="2026-04-25T23:54:51.829255" 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-04-25T23:54:51.819309" elapsed="0.009988"/>
</kw>
<msg time="2026-04-25T23:54:51.829398" 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-04-25T23:54:51.818987" elapsed="0.010434"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.830327" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:54:51.829583" elapsed="0.000771"/>
</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-04-25T23:54:51.830826" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.830482" elapsed="0.000411"/>
</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-04-25T23:54:51.863192" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.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-04-25T23:54:51.862771" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:51.864087" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.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-04-25T23:54:51.863755" elapsed="0.000416">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:51.864267" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:51.863404" elapsed="0.000888"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.864858" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:51.864455" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:51.865188" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:51.865378" 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-04-25T23:54:51.865045" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.865828" 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-04-25T23:54:51.865561" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.866895" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:51.866588" elapsed="0.000353"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.867377" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.867100" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.868351" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:51.867811" elapsed="0.000565"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.869757" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.869209" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.869918" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:54:51.870162" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:51.868595" 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-04-25T23:54:51.870341" elapsed="0.000528"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:54:51.867671" elapsed="0.003240"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.871675" 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-04-25T23:54:51.871159" elapsed="0.000549"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.872856" 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-04-25T23:54:51.872355" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.873011" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:51.873240" 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-04-25T23:54:51.871920" elapsed="0.001345"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.873466" elapsed="0.000558"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:51.871028" elapsed="0.003039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.875037" 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-04-25T23:54:51.874311" elapsed="0.000753"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.876189" 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-04-25T23:54:51.875700" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.876344" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:51.876571" 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-04-25T23:54:51.875247" elapsed="0.001349"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.876787" elapsed="0.000641"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:54:51.874181" elapsed="0.003291"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.878311" 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-04-25T23:54:51.877812" elapsed="0.000524"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.879457" 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-04-25T23:54:51.878982" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.879610" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:51.879852" 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-04-25T23:54:51.878519" elapsed="0.001359"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.880027" elapsed="0.000469"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:54:51.877586" elapsed="0.002952"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.881298" 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-04-25T23:54:51.880801" elapsed="0.000523"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.882493" 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-04-25T23:54:51.882025" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.882645" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:54:51.882898" 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-04-25T23:54:51.881505" elapsed="0.001419"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.883072" elapsed="0.000465"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:54:51.880650" elapsed="0.002929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.884338" 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-04-25T23:54:51.883844" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.885469" 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-04-25T23:54:51.884995" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.885624" elapsed="0.000112"/>
</return>
<msg time="2026-04-25T23:54:51.885934" 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-04-25T23:54:51.884544" elapsed="0.001415"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.886106" elapsed="0.000463"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:54:51.883713" elapsed="0.002897"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.887377" 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-04-25T23:54:51.886887" elapsed="0.000516"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.888504" 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-04-25T23:54:51.888032" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.888670" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:51.888903" 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-04-25T23:54:51.887583" elapsed="0.001346"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.889114" elapsed="0.000477"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:54:51.886737" elapsed="0.002896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.890473" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:54:51.889981" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:54:51.891628" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.891154" elapsed="0.000529"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:54:51.891799" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:54:51.892024" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:54:51.890695" elapsed="0.001355"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:51.892195" elapsed="0.000482"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:54:51.889850" elapsed="0.002870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:54:51.867461" elapsed="0.025294"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:54:51.892798" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:51.892961" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:54:51.866268" elapsed="0.026720"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:51.865956" elapsed="0.027063"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.893193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.893045" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.865929" elapsed="0.027338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.894215" level="INFO">${final_text} = /restconf/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-04-25T23:54:51.893408" elapsed="0.000835"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:51.894290" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:51.862130" elapsed="0.032284"/>
</kw>
<msg time="2026-04-25T23:54:51.894469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.849181" elapsed="0.045338"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.907136" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.919407" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.931761" 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-04-25T23:54:51.931987" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.932160" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.932532" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.932386" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:51.932370" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.932762" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.932929" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.933091" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:51.932341" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.932238" 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-04-25T23:54:51.933310" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:51.933384" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:54:51.933504" level="INFO">${uri} = /restconf/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-04-25T23:54:51.844672" elapsed="0.088859"/>
</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-04-25T23:54:51.959665" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.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-04-25T23:54:51.959269" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:51.960434" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.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-04-25T23:54:51.960190" elapsed="0.000321">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:51.960603" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:51.959857" elapsed="0.000770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.961187" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/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-04-25T23:54:51.960804" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:54:51.961506" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:54:51.961686" 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-04-25T23:54:51.961370" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.962111" 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-04-25T23:54:51.961869" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:54:51.962525" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:51.962230" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.963123" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:51.962809" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:51.962608" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:51.962210" elapsed="0.000998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:54:51.964083" 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.48&lt;/host&gt;
    &lt;p...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:54:51.963349" elapsed="0.000765"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:54:51.964162" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:54:51.958616" elapsed="0.005673"/>
</kw>
<msg time="2026-04-25T23:54:51.964344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:51.946109" elapsed="0.018283"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.977069" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:51.989319" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.001501" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.001710" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.001882" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.002254" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.002112" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:52.002097" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.002466" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.002629" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.002813" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:54:52.002068" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.001957" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.003049" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.003169" elapsed="0.000018"/>
</return>
<msg time="2026-04-25T23:54:52.003299" 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.48&lt;/host&gt;
    &lt;p...</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-04-25T23:54:51.943492" elapsed="0.059835"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:54:52.004581" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.004330" elapsed="0.000314">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:54:52.004753" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:54:52.003995" 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-04-25T23:54:52.005089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.004847" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.005634" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:54:52.005345" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:52.005169" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.004829" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.008074" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:52.005889" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:54:52.008152" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:52.008303" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:54:52.003671" elapsed="0.004657"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.009719" level="INFO">/restconf/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-04-25T23:54:52.009456" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.010153" 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.48&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-04-25T23:54:52.009917" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.010589" 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-04-25T23:54:52.010349" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.011044" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:52.010794" elapsed="0.000292"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:52.011901" 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-04-25T23:54:52.011700" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:54:52.012253" 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-04-25T23:54:52.012079" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.012423" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.013042" 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-04-25T23:54:52.012797" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:54:52.013127" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:54:52.013280" 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-04-25T23:54:52.011283" elapsed="0.002022"/>
</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">
<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="NOT RUN" start="2026-04-25T23:54:52.015666" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.013375" elapsed="0.002361"/>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:52.018702" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:54:52.015903" elapsed="0.004545">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:52.015760" elapsed="0.004780">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:52.013358" elapsed="0.007214">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:52.020982" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.021112" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.021075" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:52.021058" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.021316" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.021382" elapsed="0.000018"/>
</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-04-25T23:54:52.008670" elapsed="0.012846">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.021595" 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-04-25T23:54:51.833759" elapsed="0.187955">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:52.022034" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.021855" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:52.021837" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.022155" elapsed="0.000014"/>
</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="FAIL" start="2026-04-25T23:54:51.831148" elapsed="0.191104">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:51.830917" elapsed="0.191403">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:51.830461" elapsed="0.191889">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:54:52.022547" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>http_timeout=2</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:54:51.808991" elapsed="0.213691">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:54:51.748313" elapsed="0.274541">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t4" name="Check_ODL_Has_Netconf_Connector_For_Device" line="62">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:52.026363" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:52.026109" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.027621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.027514" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.027496" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.032706" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.032586" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.032568" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.033755" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:52.033360" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.034227" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:52.033936" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:52.034297" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:52.034449" 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-04-25T23:54:52.032992" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.039881" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.039774" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.039756" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.041167" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.041061" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.041044" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:52.041752" level="INFO">${karaf_connection_index} = 58</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.041377" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.042180" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:52.041932" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.043063" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.042765" elapsed="0.001181">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:52.044126" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:52.044171" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.042361" elapsed="0.001833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.045037" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.044762" elapsed="0.001306">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:52.046242" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:52.046287" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.044357" elapsed="0.001952"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.047433" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.046637" elapsed="0.000875">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:52.046418" elapsed="0.001187">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:52.046398" elapsed="0.001241">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.047814" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.048037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.047899" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:52.047883" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.048165" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:52.051152" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:54:52.051372" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:52.050474" elapsed="0.000991"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.052390" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.053338" 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-04-25T23:54:52.049016" elapsed="0.004433"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:52.048422" elapsed="0.005140"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.040762" elapsed="0.012885">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<msg time="2026-04-25T23:54:52.053856" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:52.053898" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.040096" elapsed="0.013825"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.054103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.053997" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.053979" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.055002" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.054876" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.054858" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.055340" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:52.055441" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:52.055215" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.055890" level="INFO">{1: 58}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:52.055615" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.056315" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:52.056078" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.056881" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:54:52.057293" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:52.057338" level="INFO">${old_connection_index} = 58</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.056510" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:52.058288" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.060581" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.060124" elapsed="0.001004">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.058712" elapsed="0.002493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:52.062835" elapsed="0.000390"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.061438" elapsed="0.001850"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:52.057772" elapsed="0.005617"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:52.057434" elapsed="0.006006"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.057416" elapsed="0.006050"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:52.064413" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.064008" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:52.064488" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:54:52.064639" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:52.063686" elapsed="0.000992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.064831" elapsed="0.000416"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.067220" level="INFO">index=59
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:52.065412" elapsed="0.001942"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:52.067504" elapsed="0.002338"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:52.070274" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:52.071125" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.070012" elapsed="0.001486">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:52.081771" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:54:52.082143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:52.080450" elapsed="0.001781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.082559" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.082838" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:52.072287" elapsed="0.010718"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:52.071784" elapsed="0.011273"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.054559" elapsed="0.028579">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.083472" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.083545" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.039427" elapsed="0.044221">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:52.084101" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:52.084144" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.034853" elapsed="0.049314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.084539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.084286" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.084267" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:52.034714" elapsed="0.049924"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:52.034525" elapsed="0.050161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:52.032228" elapsed="0.052512"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:52.027232" elapsed="0.057562"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:52.026801" elapsed="0.058036"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:52.024004" elapsed="0.060883"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:52.096452" 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-04-25T23:54:52.094229" elapsed="0.002250"/>
</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-04-25T23:54:52.096829" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:52.096672" elapsed="0.000215"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.096538" elapsed="0.000375"/>
</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-04-25T23:54:52.097211" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.096975" elapsed="0.000292"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.098102" level="INFO">${uri} = /restconf/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-04-25T23:54:52.097550" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:52.097290" elapsed="0.000875"/>
</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-04-25T23:54:52.098354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.098190" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:52.096958" elapsed="0.001470"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:52.098462" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:52.098610" level="INFO">${uri} = /restconf/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-04-25T23:54:52.093774" elapsed="0.004861"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:52.098698" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:54:52.098843" level="INFO">${uri} = /restconf/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-04-25T23:54:52.093256" elapsed="0.005611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.106103" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:52.105853" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:52.106536" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:52.106297" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:52.111131" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.108800" elapsed="0.003964">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:52.106668" elapsed="0.006176">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.113024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:52.112877" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:52.106629" elapsed="0.006517">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.113513" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.113642" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:52.113606" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:52.113589" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.113864" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.113933" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.101490" elapsed="0.012546">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.114106" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:52.099112" elapsed="0.015088">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.114362" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:52.114524" elapsed="0.000019"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:52.114585" elapsed="0.000015"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:52.085832" elapsed="0.028867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:52.114859" elapsed="0.000021"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:52.085476" elapsed="0.029520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:53.131755" 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-04-25T23:54:53.129542" elapsed="0.002250"/>
</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-04-25T23:54:53.132165" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:53.132007" elapsed="0.000216"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:53.131868" elapsed="0.000387"/>
</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-04-25T23:54:53.132601" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:53.132329" 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-04-25T23:54:53.133420" level="INFO">${uri} = /restconf/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-04-25T23:54:53.132933" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:53.132699" 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-04-25T23:54:53.133689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:53.133508" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:53.132308" elapsed="0.001459"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:53.133807" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:54:53.133978" level="INFO">${uri} = /restconf/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-04-25T23:54:53.129053" elapsed="0.005027"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:53.134132" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:53.134277" level="INFO">${uri} = /restconf/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-04-25T23:54:53.128476" elapsed="0.005826"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:53.141732" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:53.141431" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:53.142220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:53.141951" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:53.147362" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:53.144402" elapsed="0.004805">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:53.142342" elapsed="0.006957">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:53.149501" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:53.149346" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:53.142322" elapsed="0.007286">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:53.150031" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:53.150173" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:53.150135" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:53.150118" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:53.150378" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:53.150445" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:53.136973" elapsed="0.013578">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:53.150620" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:53.134526" elapsed="0.016210">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:53.150906" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:53.151071" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:53.151132" elapsed="0.000015"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:53.116755" elapsed="0.034474">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:53.151390" elapsed="0.000020"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:53.115719" elapsed="0.035853">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:54.169056" 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-04-25T23:54:54.166698" elapsed="0.002392"/>
</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-04-25T23:54:54.169448" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:54.169292" elapsed="0.000215"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:54.169160" elapsed="0.000377"/>
</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-04-25T23:54:54.169898" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:54.169609" 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-04-25T23:54:54.170707" level="INFO">${uri} = /restconf/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-04-25T23:54:54.170208" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:54.169981" 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-04-25T23:54:54.170960" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:54.170797" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:54.169589" elapsed="0.001447"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:54.171073" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:54.171236" level="INFO">${uri} = /restconf/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-04-25T23:54:54.166198" elapsed="0.005064"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:54.171310" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:54.171454" level="INFO">${uri} = /restconf/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-04-25T23:54:54.165626" elapsed="0.005853"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:54.178724" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:54.178449" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:54.179165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:54.178923" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:54.183976" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:54.181329" elapsed="0.004395">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:54.179275" elapsed="0.006538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:54.185998" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:54.185848" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:54.179258" elapsed="0.006827">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:54.186457" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:54.186589" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:54.186552" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:54.186535" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:54.186881" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:54.186953" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:54.174142" elapsed="0.012916">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:54.187129" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:54.171712" elapsed="0.015511">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:54.187390" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:54.187554" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:54.187617" elapsed="0.000016"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:54.153764" elapsed="0.033965">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:54.187888" elapsed="0.000022"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:54.152704" elapsed="0.035292">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:55.207039" 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-04-25T23:54:55.204896" elapsed="0.002175"/>
</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-04-25T23:54:55.207427" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:55.207275" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:55.207142" 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-04-25T23:54:55.207868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:55.207586" 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-04-25T23:54:55.208682" level="INFO">${uri} = /restconf/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-04-25T23:54:55.208178" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:55.207950" 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-04-25T23:54:55.208933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:55.208772" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:55.207565" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:55.209044" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:55.209207" level="INFO">${uri} = /restconf/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-04-25T23:54:55.204209" elapsed="0.005023"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:55.209280" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:55.209422" level="INFO">${uri} = /restconf/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-04-25T23:54:55.203435" elapsed="0.006012"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:55.216637" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:55.216364" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:55.217098" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:55.216854" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:55.221884" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:55.219327" elapsed="0.004256">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:55.217280" elapsed="0.006411">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:55.223880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:55.223727" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:55.217260" elapsed="0.006709">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:55.224343" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:55.224476" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:55.224438" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:55.224421" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:55.224714" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:55.224785" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:55.212070" elapsed="0.012819">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:55.224960" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:54:55.209681" elapsed="0.015374">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:55.225224" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:55.225389" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:55.225452" elapsed="0.000196"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:55.190330" elapsed="0.035425">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:55.225919" elapsed="0.000021"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:55.188689" elapsed="0.037339">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:56.244374" 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-04-25T23:54:56.242136" elapsed="0.002276"/>
</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-04-25T23:54:56.244929" elapsed="0.000027"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:56.244639" elapsed="0.000356"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:56.244495" elapsed="0.000533"/>
</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-04-25T23:54:56.245541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:56.245261" 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-04-25T23:54:56.246376" level="INFO">${uri} = /restconf/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-04-25T23:54:56.245885" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:56.245627" 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-04-25T23:54:56.246629" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:56.246464" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:56.245233" elapsed="0.001490"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:56.246767" elapsed="0.000047"/>
</return>
<msg time="2026-04-25T23:54:56.246944" level="INFO">${uri} = /restconf/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-04-25T23:54:56.241598" elapsed="0.005371"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:56.247017" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:56.247159" level="INFO">${uri} = /restconf/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-04-25T23:54:56.240978" elapsed="0.006206"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:56.254442" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:56.254178" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:56.254898" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:56.254639" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:56.260067" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:56.257237" elapsed="0.004677">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:56.255006" elapsed="0.006999">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:56.262213" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:56.262040" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:56.254988" elapsed="0.007323">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:56.262731" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:56.262879" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:56.262842" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:56.262823" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:56.263085" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:56.263155" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:56.249868" elapsed="0.013401">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:56.263340" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:56.247406" elapsed="0.016027">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:56.263639" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:56.263826" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:56.263890" elapsed="0.000015"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:56.227945" elapsed="0.036042">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:56.264148" elapsed="0.000021"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:56.226850" elapsed="0.037414">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Count_Netconf_Connectors">
<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-04-25T23:54:57.281477" 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-04-25T23:54:57.278970" elapsed="0.002544"/>
</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-04-25T23:54:57.281931" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:54:57.281767" elapsed="0.000224"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.281595" 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-04-25T23:54:57.282371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.282102" 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-04-25T23:54:57.283174" level="INFO">${uri} = /restconf/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-04-25T23:54:57.282696" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:57.282455" 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-04-25T23:54:57.283424" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.283262" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.282080" elapsed="0.001418"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:57.283539" elapsed="0.000047"/>
</return>
<msg time="2026-04-25T23:54:57.283729" level="INFO">${uri} = /restconf/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-04-25T23:54:57.278451" elapsed="0.005303"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:57.283801" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:57.283942" level="INFO">${uri} = /restconf/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-04-25T23:54:57.277851" elapsed="0.006115"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.291171" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:57.290907" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.291611" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:57.291368" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:57.296519" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.293809" elapsed="0.004515">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:57.291737" elapsed="0.006684">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.298752" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.298538" elapsed="0.000283"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:57.291718" elapsed="0.007127">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.299277" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.299418" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.299377" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:57.299358" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.299627" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.299713" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.286604" elapsed="0.013223">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.299904" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:54:57.284185" elapsed="0.015813">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.300171" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:54:57.300337" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.300399" elapsed="0.000015"/>
</return>
<var>${count}</var>
<arg>${device_name}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:54:57.266107" elapsed="0.034387">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.300668" elapsed="0.000023"/>
</kw>
<status status="FAIL" start="2026-04-25T23:54:57.265009" elapsed="0.035771">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:54:57.300884" level="FAIL">Keyword 'Count_Netconf_Connectors' failed after retrying for 5 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>5 sec</arg>
<arg>1 sec</arg>
<arg>Count_Netconf_Connectors</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-25T23:54:52.085049" elapsed="5.215940">Keyword 'Count_Netconf_Connectors' failed after retrying for 5 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the list of configured devices and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:54:52.023353" elapsed="5.277835">Keyword 'Count_Netconf_Connectors' failed after retrying for 5 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t5" name="Wait_For_Device_To_Become_Connected" line="67">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:54:57.305003" elapsed="0.000258"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:54:57.304726" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.306415" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.306286" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.306264" 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-04-25T23:54:57.311597" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.311473" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.311451" elapsed="0.000241"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.312791" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:54:57.312343" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.313285" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:54:57.312984" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:54:57.313358" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:54:57.313524" 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-04-25T23:54:57.311953" elapsed="0.001596"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.319183" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.319060" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.319037" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.320598" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.320488" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.320470" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:57.321225" 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-04-25T23:54:57.320846" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.321705" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:57.321416" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.322789" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.322293" elapsed="0.001514">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:57.323998" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:54:57.324050" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.321893" elapsed="0.002180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.324974" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.324680" elapsed="0.001382">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:54:57.326245" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:54:57.326292" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.324249" elapsed="0.002067"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.327300" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.326643" elapsed="0.000738">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:57.326402" elapsed="0.001076">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:54:57.326378" elapsed="0.001135">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.327697" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.327926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.327786" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:57.327769" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.328058" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:57.331286" elapsed="0.000169"/>
</kw>
<msg time="2026-04-25T23:54:57.331600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:57.330506" 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-04-25T23:54:57.332644" elapsed="0.000053"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.333796" elapsed="0.000042"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:57.328996" elapsed="0.004934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:57.328361" elapsed="0.005684"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.320179" elapsed="0.013961">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</status>
</kw>
<msg time="2026-04-25T23:54:57.334253" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:57.334298" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Become_Connected"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.319438" elapsed="0.014884"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.334536" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.334413" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.334387" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.335496" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.335390" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.335373" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.335893" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:57.336002" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:54:57.335734" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.336466" level="INFO">{1: 59}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:57.336180" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.336918" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:57.336675" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:57.337503" elapsed="0.000521"/>
</kw>
<msg time="2026-04-25T23:54:57.338125" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:54:57.338171" 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-04-25T23:54:57.337119" elapsed="0.001075"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:57.339028" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.341427" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.340736" elapsed="0.001547">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.339436" elapsed="0.002928"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:54:57.343933" elapsed="0.000377"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.342613" elapsed="0.001764"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:54:57.338496" elapsed="0.005983"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:57.338271" elapsed="0.006260"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.338251" elapsed="0.006311"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:54:57.345611" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:54:57.345185" elapsed="0.000496"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:54:57.345738" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:54:57.345903" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:54:57.344814" elapsed="0.001114"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:54:57.346081" elapsed="0.000555"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.346946" level="INFO">index=60
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:54:57.346822" elapsed="0.000251"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:54:57.347221" elapsed="0.002395"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:54:57.350296" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:54:57.351584" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.350008" elapsed="0.002024">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:54:57.363221" elapsed="0.000350"/>
</kw>
<msg time="2026-04-25T23:54:57.363647" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:54:57.361402" elapsed="0.002364"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.364104" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.364363" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:54:57.352982" elapsed="0.011528"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:54:57.352374" elapsed="0.012187"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.335070" elapsed="0.029600">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.365074" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.365155" 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="FAIL" start="2026-04-25T23:54:57.318633" elapsed="0.046640">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:54:57.365396" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:54:57.365443" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.313967" elapsed="0.051500"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.365865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.365552" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.365531" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:54:57.313824" elapsed="0.052145"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:54:57.313612" elapsed="0.052394"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:54:57.311041" elapsed="0.055027"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:54:57.305984" elapsed="0.060144"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:54:57.305477" elapsed="0.060698"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:54:57.302252" elapsed="0.063980"/>
</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-04-25T23:54:57.379035" 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-04-25T23:54:57.376882" elapsed="0.002186"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.379922" 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-04-25T23:54:57.379560" elapsed="0.000389"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:54:57.379382" elapsed="0.000603"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.380533" 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-04-25T23:54:57.380215" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:57.380066" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:54:57.379225" elapsed="0.001399"/>
</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-04-25T23:54:57.380976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.380718" 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-04-25T23:54:57.381810" level="INFO">${uri} = /restconf/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-04-25T23:54:57.381289" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:57.381059" 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-04-25T23:54:57.382060" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.381899" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:57.380696" elapsed="0.001439"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:57.382176" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:54:57.382343" level="INFO">${uri} = /restconf/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-04-25T23:54:57.376369" elapsed="0.006000"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:57.382418" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:57.382565" level="INFO">${uri} = /restconf/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-04-25T23:54:57.375611" elapsed="0.006980"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.390225" level="INFO">/restconf/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-04-25T23:54:57.389896" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:57.390697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:57.390439" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:57.395633" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.392922" elapsed="0.004464">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:57.390820" elapsed="0.006665">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.397765" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:57.397526" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:57.390796" elapsed="0.007060">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.398294" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.398436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:57.398394" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:57.398376" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:57.398739" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.398810" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.385466" elapsed="0.013458">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:57.398996" 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-04-25T23:54:57.382856" elapsed="0.016237">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:57.399265" 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-04-25T23:54:57.367696" elapsed="0.031690">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:58.414643" 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-04-25T23:54:58.412420" elapsed="0.002272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:58.415416" 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-04-25T23:54:58.415092" elapsed="0.000351"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:54:58.414935" elapsed="0.000544"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:58.416045" 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-04-25T23:54:58.415727" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:58.415562" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:54:58.414777" 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-04-25T23:54:58.416489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:58.416217" 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-04-25T23:54:58.417295" level="INFO">${uri} = /restconf/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-04-25T23:54:58.416823" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:58.416574" 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-04-25T23:54:58.417547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:58.417384" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:58.416193" elapsed="0.001429"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:58.417678" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:54:58.417857" level="INFO">${uri} = /restconf/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-04-25T23:54:58.411917" elapsed="0.005965"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:58.417930" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:54:58.418070" level="INFO">${uri} = /restconf/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-04-25T23:54:58.411304" elapsed="0.006791"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:58.425384" level="INFO">/restconf/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-04-25T23:54:58.425119" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:58.425937" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:58.425683" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:58.431015" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:58.428100" elapsed="0.004695">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:58.426047" elapsed="0.006837">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:58.433069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:58.432919" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:58.426029" elapsed="0.007128">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:58.433537" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:58.433690" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:58.433632" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:58.433615" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:58.433894" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:58.433962" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:54:58.420812" elapsed="0.013260">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:58.434142" 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-04-25T23:54:58.418338" elapsed="0.015922">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:58.434435" 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-04-25T23:54:58.400103" elapsed="0.034440">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:59.495107" 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-04-25T23:54:59.492842" elapsed="0.002300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:59.495859" 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-04-25T23:54:59.495516" elapsed="0.000370"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:54:59.495362" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:54:59.496470" 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-04-25T23:54:59.496154" elapsed="0.000342"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:54:59.496006" elapsed="0.000605"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:54:59.495216" elapsed="0.001427"/>
</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-04-25T23:54:59.496998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:59.496734" 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-04-25T23:54:59.497795" level="INFO">${uri} = /restconf/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-04-25T23:54:59.497307" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:54:59.497080" 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-04-25T23:54:59.498046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:59.497886" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:54:59.496711" elapsed="0.001411"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:59.498160" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:54:59.498327" level="INFO">${uri} = /restconf/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-04-25T23:54:59.492350" elapsed="0.006003"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:54:59.498400" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:54:59.498544" level="INFO">${uri} = /restconf/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-04-25T23:54:59.491689" elapsed="0.006880"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:59.505971" level="INFO">/restconf/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-04-25T23:54:59.505710" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:54:59.506413" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:54:59.506170" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:54:59.511306" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:54:59.508626" elapsed="0.004386">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:54:59.506522" elapsed="0.006578">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:59.513284" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:54:59.513134" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:54:59.506504" elapsed="0.006867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:59.513755" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:59.513886" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:54:59.513850" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:54:59.513834" elapsed="0.000111"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:54:59.514086" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:54:59.514155" 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-04-25T23:54:59.501276" elapsed="0.012983">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:54:59.514383" 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-04-25T23:54:59.498826" elapsed="0.015657">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:59.514667" 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-04-25T23:54:59.435457" elapsed="0.079343">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:00.532351" 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-04-25T23:55:00.529347" elapsed="0.003033"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:00.533071" 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-04-25T23:55:00.532740" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:00.532571" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:00.533704" 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-04-25T23:55:00.533366" elapsed="0.000367"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:00.533216" elapsed="0.000553"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:00.532437" elapsed="0.001361"/>
</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-04-25T23:55:00.534105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:00.533862" 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-04-25T23:55:00.534902" level="INFO">${uri} = /restconf/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-04-25T23:55:00.534415" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:00.534187" 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-04-25T23:55:00.535156" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:00.534996" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:00.533844" elapsed="0.001387"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:00.535265" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:55:00.535429" level="INFO">${uri} = /restconf/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-04-25T23:55:00.528649" elapsed="0.006807"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:00.535502" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:00.535644" level="INFO">${uri} = /restconf/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-04-25T23:55:00.527872" elapsed="0.007813"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:00.542909" level="INFO">/restconf/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-04-25T23:55:00.542643" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:00.543359" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:00.543106" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:00.548220" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:00.545558" elapsed="0.004331">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:00.543470" elapsed="0.006562">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:00.550222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:00.550069" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:00.543452" elapsed="0.006857">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:00.550688" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:00.550820" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:00.550784" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:00.550767" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:00.551020" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:00.551089" 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-04-25T23:55:00.538347" elapsed="0.012845">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:00.551262" 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-04-25T23:55:00.535907" elapsed="0.015463">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:00.551536" 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-04-25T23:55:00.515586" elapsed="0.036057">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:01.568161" 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-04-25T23:55:01.566070" elapsed="0.002120"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:01.568878" 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-04-25T23:55:01.568534" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:01.568383" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:01.569492" 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-04-25T23:55:01.569171" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:01.569021" elapsed="0.000534"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:01.568247" elapsed="0.001337"/>
</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-04-25T23:55:01.569909" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:01.569650" 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-04-25T23:55:01.570704" level="INFO">${uri} = /restconf/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-04-25T23:55:01.570219" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:01.569991" elapsed="0.000818"/>
</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-04-25T23:55:01.571000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:01.570836" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:01.569631" elapsed="0.001446"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:01.571112" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:01.571264" level="INFO">${uri} = /restconf/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-04-25T23:55:01.565598" elapsed="0.005692"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:01.571337" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:01.571481" level="INFO">${uri} = /restconf/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-04-25T23:55:01.565040" elapsed="0.006467"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:01.578746" level="INFO">/restconf/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-04-25T23:55:01.578482" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:01.579182" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:01.578942" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:01.583898" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:01.581337" elapsed="0.004182">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:01.579291" elapsed="0.006310">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:01.585813" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:01.585634" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:01.579272" elapsed="0.006628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:01.586270" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:01.586400" elapsed="0.000163"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:01.586364" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:01.586347" elapsed="0.000268"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:01.586775" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:01.586846" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:01.574198" elapsed="0.012753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:01.587021" 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-04-25T23:55:01.571743" elapsed="0.015372">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:01.587315" 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-04-25T23:55:01.552488" elapsed="0.034939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:02.603676" 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-04-25T23:55:02.601598" elapsed="0.002106"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:02.604372" 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-04-25T23:55:02.604038" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:02.603887" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:02.605066" 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-04-25T23:55:02.604680" elapsed="0.000416"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:02.604512" elapsed="0.000620"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:02.603759" 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-04-25T23:55:02.605470" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:02.605224" elapsed="0.000302"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:02.606269" level="INFO">${uri} = /restconf/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-04-25T23:55:02.605797" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:02.605549" 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-04-25T23:55:02.606517" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:02.606358" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:02.605206" elapsed="0.001385"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:02.606624" elapsed="0.000043"/>
</return>
<msg time="2026-04-25T23:55:02.606789" level="INFO">${uri} = /restconf/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-04-25T23:55:02.601150" elapsed="0.005665"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:02.606861" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:02.607001" level="INFO">${uri} = /restconf/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-04-25T23:55:02.600438" elapsed="0.006588"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:02.614417" level="INFO">/restconf/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-04-25T23:55:02.614168" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:02.614869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:02.614612" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:02.619547" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:02.617030" elapsed="0.004126">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:02.614978" elapsed="0.006259">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:02.621456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:02.621303" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:02.614960" elapsed="0.006583">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:02.621924" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:02.622059" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:02.622023" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:02.622005" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:02.622260" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:02.622328" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:02.609715" elapsed="0.012717">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:02.622502" 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-04-25T23:55:02.607245" elapsed="0.015349">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:02.622775" 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-04-25T23:55:02.588254" elapsed="0.034630">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:03.642697" 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-04-25T23:55:03.640357" elapsed="0.002375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:03.643426" 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-04-25T23:55:03.643099" elapsed="0.000355"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:03.642945" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:03.644058" 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-04-25T23:55:03.643734" elapsed="0.000351"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:03.643570" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:03.642802" 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-04-25T23:55:03.644478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:03.644219" 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-04-25T23:55:03.645290" level="INFO">${uri} = /restconf/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-04-25T23:55:03.644820" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:03.644559" 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-04-25T23:55:03.645542" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:03.645379" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:03.644199" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:03.645668" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:55:03.645896" level="INFO">${uri} = /restconf/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-04-25T23:55:03.639873" elapsed="0.006050"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:03.645973" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:03.646120" level="INFO">${uri} = /restconf/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-04-25T23:55:03.639279" elapsed="0.006866"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:03.653403" level="INFO">/restconf/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-04-25T23:55:03.653146" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:03.653861" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:03.653601" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:03.658684" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:03.656005" elapsed="0.004399">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:03.653971" elapsed="0.006517">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:03.660693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:03.660523" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:03.653953" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:03.661148" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:03.661278" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:03.661242" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:03.661225" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:03.661478" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:03.661547" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:03.648846" elapsed="0.012821">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:03.661740" 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-04-25T23:55:03.646367" elapsed="0.015468">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:03.662002" 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-04-25T23:55:03.623761" elapsed="0.038349">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:04.679920" 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-04-25T23:55:04.677226" elapsed="0.002728"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:04.680666" 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-04-25T23:55:04.680329" elapsed="0.000367"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:04.680173" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:04.681281" 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-04-25T23:55:04.680963" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:04.680814" elapsed="0.000528"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:04.680028" elapsed="0.001343"/>
</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-04-25T23:55:04.681724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:04.681446" 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-04-25T23:55:04.682542" level="INFO">${uri} = /restconf/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-04-25T23:55:04.682045" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:04.681807" 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-04-25T23:55:04.682808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:04.682631" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:04.681423" elapsed="0.001462"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:04.682923" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:55:04.683087" level="INFO">${uri} = /restconf/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-04-25T23:55:04.676535" elapsed="0.006578"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:04.683159" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:55:04.683298" level="INFO">${uri} = /restconf/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-04-25T23:55:04.675695" elapsed="0.007628"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:04.690569" level="INFO">/restconf/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-04-25T23:55:04.690313" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:04.691034" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:04.690790" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:04.695930" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:04.693238" elapsed="0.004410">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:04.691144" elapsed="0.006605">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:04.697934" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:04.697784" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:04.691125" elapsed="0.006897">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:04.698399" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:04.698590" elapsed="0.000182"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:04.698554" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:04.698536" elapsed="0.000289"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:04.698970" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:04.699039" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:04.686013" elapsed="0.013137">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:04.699220" 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-04-25T23:55:04.683545" elapsed="0.015770">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:04.699478" 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-04-25T23:55:04.663081" elapsed="0.036503">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:05.717987" 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-04-25T23:55:05.715702" elapsed="0.002319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:05.718753" 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-04-25T23:55:05.718405" elapsed="0.000376"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:05.718251" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:05.719384" 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-04-25T23:55:05.719049" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:05.718900" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:05.718102" elapsed="0.001372"/>
</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-04-25T23:55:05.719830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:05.719549" 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-04-25T23:55:05.720603" level="INFO">${uri} = /restconf/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-04-25T23:55:05.720140" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:05.719911" 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-04-25T23:55:05.720869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:05.720708" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:05.719528" elapsed="0.001417"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:05.720983" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:55:05.721144" level="INFO">${uri} = /restconf/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-04-25T23:55:05.715185" elapsed="0.005984"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:05.721215" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:05.721357" level="INFO">${uri} = /restconf/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-04-25T23:55:05.714578" elapsed="0.006803"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:05.728941" level="INFO">/restconf/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-04-25T23:55:05.728681" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:05.729382" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:05.729141" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:05.734392" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:05.731543" elapsed="0.004581">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:05.729493" elapsed="0.006717">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:05.736394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:05.736244" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:05.729474" elapsed="0.007006">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:05.736870" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:05.737001" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:05.736965" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:05.736948" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:05.737207" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:05.737276" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:05.724186" elapsed="0.013196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:05.737452" 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-04-25T23:55:05.721606" elapsed="0.015940">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:05.737729" 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-04-25T23:55:05.700459" elapsed="0.037380">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:06.755882" 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-04-25T23:55:06.753458" elapsed="0.002459"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:06.756774" 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-04-25T23:55:06.756349" elapsed="0.000454"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:06.756175" elapsed="0.000666"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:06.757489" 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-04-25T23:55:06.757164" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:06.757009" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:06.755991" elapsed="0.001591"/>
</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-04-25T23:55:06.757938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:06.757671" 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-04-25T23:55:06.758752" level="INFO">${uri} = /restconf/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-04-25T23:55:06.758250" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:06.758021" 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-04-25T23:55:06.759002" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:06.758842" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:06.757634" elapsed="0.001444"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:06.759117" elapsed="0.000043"/>
</return>
<msg time="2026-04-25T23:55:06.759290" level="INFO">${uri} = /restconf/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-04-25T23:55:06.752961" elapsed="0.006355"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:06.759363" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:06.759507" level="INFO">${uri} = /restconf/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-04-25T23:55:06.752181" elapsed="0.007351"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:06.767101" level="INFO">/restconf/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-04-25T23:55:06.766790" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:06.767555" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:06.767311" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:06.772551" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:06.769851" elapsed="0.004438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:06.767691" elapsed="0.006695">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:06.774614" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:06.774427" elapsed="0.000270"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:06.767668" elapsed="0.007054">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:06.775162" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:06.775304" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:06.775263" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:06.775244" 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-04-25T23:55:06.775512" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:06.775581" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:06.762377" elapsed="0.013433">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:06.775887" 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-04-25T23:55:06.759787" elapsed="0.016198">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:06.776159" 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-04-25T23:55:06.738816" elapsed="0.037455">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:07.794193" 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-04-25T23:55:07.791458" elapsed="0.002770"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:07.794972" 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-04-25T23:55:07.794607" elapsed="0.000392"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:07.794451" elapsed="0.000585"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:07.795597" 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-04-25T23:55:07.795274" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:07.795119" elapsed="0.000555"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:07.794303" 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-04-25T23:55:07.796058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:07.795787" 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-04-25T23:55:07.796898" level="INFO">${uri} = /restconf/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-04-25T23:55:07.796388" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:07.796154" 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-04-25T23:55:07.797155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:07.796990" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:07.795762" elapsed="0.001471"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:07.797271" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:07.797433" level="INFO">${uri} = /restconf/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-04-25T23:55:07.790790" elapsed="0.006670"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:07.797507" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:07.797669" level="INFO">${uri} = /restconf/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-04-25T23:55:07.789943" elapsed="0.007756"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:07.805151" level="INFO">/restconf/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-04-25T23:55:07.804884" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:07.805593" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:07.805351" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:07.810548" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:07.807898" elapsed="0.004479">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:07.805721" elapsed="0.006744">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:07.812673" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:07.812502" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:07.805702" elapsed="0.007063">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:07.813157" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:07.813295" elapsed="0.001669"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:07.813258" elapsed="0.001746"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:07.813241" elapsed="0.001794"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:07.815188" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:07.815264" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:07.800442" elapsed="0.014933">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:07.815448" 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-04-25T23:55:07.797947" elapsed="0.017600">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:07.815765" 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-04-25T23:55:07.777203" elapsed="0.038682">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:08.827887" 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-04-25T23:55:08.825585" elapsed="0.002337"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:08.828629" 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-04-25T23:55:08.828299" elapsed="0.000379"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:08.828145" elapsed="0.000572"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:08.829274" 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-04-25T23:55:08.828949" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:08.828799" elapsed="0.000537"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:08.827998" 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-04-25T23:55:08.829721" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:08.829440" 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-04-25T23:55:08.830605" level="INFO">${uri} = /restconf/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-04-25T23:55:08.830035" elapsed="0.000600"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:08.829804" elapsed="0.000884"/>
</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-04-25T23:55:08.830890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:08.830714" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:08.829418" elapsed="0.001549"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:08.831006" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:08.831168" level="INFO">${uri} = /restconf/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-04-25T23:55:08.825097" elapsed="0.006098"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:08.831243" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:08.831388" level="INFO">${uri} = /restconf/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-04-25T23:55:08.824472" elapsed="0.006943"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:08.838743" level="INFO">/restconf/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-04-25T23:55:08.838453" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:08.839191" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:08.838946" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:08.844180" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:08.841495" elapsed="0.004399">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:08.839301" elapsed="0.006686">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:08.846174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:08.846023" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:08.839283" elapsed="0.006979">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:08.846689" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:08.846826" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:08.846788" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:08.846771" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:08.847031" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:08.847100" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:08.834148" elapsed="0.013059">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:08.847279" 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-04-25T23:55:08.831643" elapsed="0.015732">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:08.847578" 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-04-25T23:55:08.816474" elapsed="0.031232">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:09.865372" 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-04-25T23:55:09.862831" elapsed="0.002572"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:09.866106" 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-04-25T23:55:09.865776" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:09.865608" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:09.866737" 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-04-25T23:55:09.866400" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:09.866249" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:09.865468" elapsed="0.001361"/>
</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-04-25T23:55:09.867153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:09.866897" 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-04-25T23:55:09.867966" level="INFO">${uri} = /restconf/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-04-25T23:55:09.867469" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:09.867235" 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-04-25T23:55:09.868217" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:09.868056" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:09.866878" elapsed="0.001415"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:09.868330" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:55:09.868486" level="INFO">${uri} = /restconf/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-04-25T23:55:09.862150" elapsed="0.006362"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:09.868558" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:09.868718" level="INFO">${uri} = /restconf/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-04-25T23:55:09.861342" elapsed="0.007401"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:09.876294" level="INFO">/restconf/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-04-25T23:55:09.876034" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:09.876754" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:09.876492" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:09.881559" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:09.878909" elapsed="0.004348">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:09.876864" elapsed="0.006476">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:09.883579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:09.883424" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:09.876845" elapsed="0.006852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:09.884075" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:09.884207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:09.884170" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:09.884152" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:09.884410" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:09.884481" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:09.871649" elapsed="0.012937">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:09.884671" 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-04-25T23:55:09.868966" elapsed="0.015805">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:09.884941" 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-04-25T23:55:09.849232" elapsed="0.035819">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:10.903219" 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-04-25T23:55:10.900050" elapsed="0.003209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:10.903967" 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-04-25T23:55:10.903626" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:10.903475" elapsed="0.000554"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:10.904576" 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-04-25T23:55:10.904258" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:10.904108" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:10.903337" 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-04-25T23:55:10.904998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:10.904750" elapsed="0.000305"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:10.905801" level="INFO">${uri} = /restconf/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-04-25T23:55:10.905314" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:10.905079" 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-04-25T23:55:10.906050" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:10.905890" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:10.904731" elapsed="0.001395"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:10.906160" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:10.906360" level="INFO">${uri} = /restconf/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-04-25T23:55:10.899395" elapsed="0.006991"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:10.906432" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:10.906573" level="INFO">${uri} = /restconf/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-04-25T23:55:10.898596" elapsed="0.008002"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:10.913853" level="INFO">/restconf/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-04-25T23:55:10.913585" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:10.914304" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:10.914050" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:10.919122" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:10.916460" elapsed="0.004320">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:10.914412" elapsed="0.006450">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:10.921048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:10.920897" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:10.914394" elapsed="0.006741">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:10.921506" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:10.921638" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:10.921601" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:10.921584" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:10.921859" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:10.921927" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:10.909280" elapsed="0.012751">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:10.922101" 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-04-25T23:55:10.906833" elapsed="0.015363">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:10.922365" 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-04-25T23:55:10.885719" elapsed="0.036755">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:11.940597" 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-04-25T23:55:11.937564" elapsed="0.003066"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:11.941336" 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-04-25T23:55:11.941007" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:11.940851" elapsed="0.000549"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:11.941965" 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-04-25T23:55:11.941629" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:11.941480" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:11.940710" 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-04-25T23:55:11.942390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:11.942126" 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-04-25T23:55:11.943193" level="INFO">${uri} = /restconf/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-04-25T23:55:11.942720" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:11.942472" 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-04-25T23:55:11.943451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:11.943284" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:11.942106" elapsed="0.001422"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:11.943563" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:11.943739" level="INFO">${uri} = /restconf/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-04-25T23:55:11.936899" elapsed="0.006866"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:11.943822" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:11.943966" level="INFO">${uri} = /restconf/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-04-25T23:55:11.936088" elapsed="0.007904"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:11.951261" level="INFO">/restconf/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-04-25T23:55:11.951004" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:11.951725" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:11.951460" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:11.956476" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:11.953881" elapsed="0.004272">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:11.951836" elapsed="0.006400">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:11.958425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:11.958275" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:11.951817" elapsed="0.006694">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:11.958890" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:11.959081" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:11.959041" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:11.959023" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:11.959284" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:11.959355" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:11.946685" elapsed="0.012776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:11.959534" 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-04-25T23:55:11.944215" elapsed="0.015435">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:11.959840" 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-04-25T23:55:11.923271" elapsed="0.036680">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:12.979583" 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-04-25T23:55:12.977494" elapsed="0.002118"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:12.980288" 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-04-25T23:55:12.979964" elapsed="0.000352"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:12.979813" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:12.980915" 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-04-25T23:55:12.980579" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:12.980430" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:12.979679" elapsed="0.001328"/>
</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-04-25T23:55:12.981311" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:12.981071" 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-04-25T23:55:12.982107" level="INFO">${uri} = /restconf/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-04-25T23:55:12.981622" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:12.981392" 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-04-25T23:55:12.982370" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:12.982207" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:12.981053" elapsed="0.001393"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:12.982480" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:12.982629" level="INFO">${uri} = /restconf/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-04-25T23:55:12.977043" elapsed="0.005626"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:12.982718" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:12.982862" level="INFO">${uri} = /restconf/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-04-25T23:55:12.976473" elapsed="0.006415"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:12.990265" level="INFO">/restconf/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-04-25T23:55:12.990002" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:12.990720" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:12.990463" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:12.995387" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:12.992880" elapsed="0.004123">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:12.990831" elapsed="0.006254">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:12.997271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:12.997120" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:12.990813" elapsed="0.006547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:12.997739" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:12.997873" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:12.997836" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:12.997819" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:12.998088" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:12.998158" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:12.985587" elapsed="0.012675">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:12.998333" 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-04-25T23:55:12.983106" elapsed="0.015321">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:12.998594" 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-04-25T23:55:12.960556" elapsed="0.038163">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:14.016170" 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-04-25T23:55:14.013774" elapsed="0.002430"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:14.016924" 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-04-25T23:55:14.016574" elapsed="0.000378"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:14.016419" elapsed="0.000570"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:14.017602" 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-04-25T23:55:14.017274" elapsed="0.000356"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:14.017120" elapsed="0.000566"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:14.016271" 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-04-25T23:55:14.018062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:14.017789" 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-04-25T23:55:14.018867" level="INFO">${uri} = /restconf/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-04-25T23:55:14.018377" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:14.018145" elapsed="0.000787"/>
</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-04-25T23:55:14.019121" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:14.018958" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:14.017769" elapsed="0.001429"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:14.019236" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:14.019398" level="INFO">${uri} = /restconf/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-04-25T23:55:14.013063" elapsed="0.006361"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:14.019473" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:14.019618" level="INFO">${uri} = /restconf/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-04-25T23:55:14.012240" elapsed="0.007404"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:14.026986" level="INFO">/restconf/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-04-25T23:55:14.026714" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:14.027433" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:14.027188" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:14.032456" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:14.029752" elapsed="0.004422">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:14.027545" elapsed="0.006713">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:14.034441" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:14.034292" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:14.027526" elapsed="0.007001">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:14.034911" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:14.035042" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:14.035006" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:14.034989" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:14.035239" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:14.035306" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:14.022352" elapsed="0.013093">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:14.035518" 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-04-25T23:55:14.019888" elapsed="0.015725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:14.035804" 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-04-25T23:55:14.000907" elapsed="0.035007">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:15.056040" 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-04-25T23:55:15.053916" elapsed="0.002158"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:15.056780" 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-04-25T23:55:15.056437" elapsed="0.000371"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:15.056282" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:15.057396" 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-04-25T23:55:15.057077" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:15.056925" elapsed="0.000538"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:15.056141" 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-04-25T23:55:15.057838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:15.057563" 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-04-25T23:55:15.058633" level="INFO">${uri} = /restconf/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-04-25T23:55:15.058150" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:15.057920" 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-04-25T23:55:15.058908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:15.058743" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:15.057542" elapsed="0.001442"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:15.059020" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:15.059180" level="INFO">${uri} = /restconf/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-04-25T23:55:15.053424" elapsed="0.005783"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:15.059254" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:15.059397" level="INFO">${uri} = /restconf/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-04-25T23:55:15.052843" elapsed="0.006581"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:15.066943" level="INFO">/restconf/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-04-25T23:55:15.066684" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:15.067389" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:15.067145" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:15.072333" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:15.069598" elapsed="0.004520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:15.067535" elapsed="0.006668">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:15.074395" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:15.074239" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:15.067514" elapsed="0.006972">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:15.074890" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:15.075025" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:15.074988" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:15.074970" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:15.075225" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:15.075294" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:15.062339" elapsed="0.013066">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:15.075477" 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-04-25T23:55:15.059647" elapsed="0.015925">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:15.075755" 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-04-25T23:55:15.036866" elapsed="0.039000">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:16.092941" 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-04-25T23:55:16.090581" elapsed="0.002392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:16.093689" 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-04-25T23:55:16.093334" elapsed="0.000383"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:16.093179" elapsed="0.000575"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:16.094301" 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-04-25T23:55:16.093983" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:16.093834" elapsed="0.000529"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:16.093039" elapsed="0.001353"/>
</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-04-25T23:55:16.094733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:16.094461" 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-04-25T23:55:16.095581" level="INFO">${uri} = /restconf/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-04-25T23:55:16.095047" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:16.094816" 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-04-25T23:55:16.095853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:16.095688" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:16.094441" elapsed="0.001489"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:16.095965" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:16.096125" level="INFO">${uri} = /restconf/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-04-25T23:55:16.090104" elapsed="0.006047"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:16.096199" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:16.096343" level="INFO">${uri} = /restconf/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-04-25T23:55:16.089509" elapsed="0.006859"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:16.103794" level="INFO">/restconf/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-04-25T23:55:16.103523" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:16.104230" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:16.103990" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:16.109038" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:16.106393" elapsed="0.004389">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:16.104338" elapsed="0.006528">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:16.111056" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:16.110901" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:16.104320" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:16.111530" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:16.111679" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:16.111625" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:16.111608" 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-04-25T23:55:16.111883" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:16.111952" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:16.099213" elapsed="0.012843">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:16.112127" 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-04-25T23:55:16.096739" elapsed="0.015483">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:16.112459" 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-04-25T23:55:16.076599" elapsed="0.035974">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:17.136828" 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-04-25T23:55:17.133762" elapsed="0.003104"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:17.137563" 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-04-25T23:55:17.137233" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:17.137079" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:17.138192" 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-04-25T23:55:17.137874" elapsed="0.000344"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:17.137722" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:17.136934" 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-04-25T23:55:17.138610" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:17.138353" 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-04-25T23:55:17.139444" level="INFO">${uri} = /restconf/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-04-25T23:55:17.138962" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:17.138729" 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-04-25T23:55:17.139711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:17.139534" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:17.138333" elapsed="0.001455"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:17.139824" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:17.139984" level="INFO">${uri} = /restconf/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-04-25T23:55:17.132684" elapsed="0.007326"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:17.140056" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:17.140201" level="INFO">${uri} = /restconf/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-04-25T23:55:17.131366" elapsed="0.008861"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:17.147666" level="INFO">/restconf/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-04-25T23:55:17.147392" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:17.148104" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:17.147864" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:17.152907" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:17.150264" elapsed="0.004337">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:17.148213" elapsed="0.006500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:17.154959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:17.154804" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:17.148194" elapsed="0.006867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:17.155446" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:17.155577" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:17.155541" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:17.155524" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:17.155796" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:17.155865" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:17.142922" elapsed="0.013048">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:17.156040" 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-04-25T23:55:17.140450" elapsed="0.015684">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:17.156299" elapsed="0.000020"/>
</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-04-25T23:55:17.113327" elapsed="0.043084">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.175917" 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-04-25T23:55:18.173739" elapsed="0.002210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.176637" 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-04-25T23:55:18.176309" elapsed="0.000370"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:18.176155" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.177268" 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-04-25T23:55:18.176948" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:18.176797" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.176016" elapsed="0.001343"/>
</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-04-25T23:55:18.177709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.177429" 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-04-25T23:55:18.178490" level="INFO">${uri} = /restconf/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-04-25T23:55:18.178021" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.177792" 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-04-25T23:55:18.178765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.178578" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.177409" elapsed="0.001435"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:18.178879" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:55:18.179142" level="INFO">${uri} = /restconf/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-04-25T23:55:18.173242" elapsed="0.005927"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:18.179218" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:18.179362" level="INFO">${uri} = /restconf/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-04-25T23:55:18.172571" 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-04-25T23:55:18.186744" level="INFO">/restconf/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-04-25T23:55:18.186454" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.187187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.186943" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.193727" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.191108" elapsed="0.004360">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.187297" elapsed="0.008260">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.195762" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.195593" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.187278" elapsed="0.008574">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.196223" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.196356" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.196319" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.196302" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.196557" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.196627" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.182107" elapsed="0.014641">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.196819" 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-04-25T23:55:18.179610" elapsed="0.017304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.197081" 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-04-25T23:55:18.158581" elapsed="0.038609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:55:18.197330" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:54:57.367073" elapsed="20.830354">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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-04-25T23:54:57.366451" elapsed="20.831088">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:54:57.301646" elapsed="20.896068">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t6" name="Check_Device_Data_Is_Empty" line="71">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:18.205704" elapsed="0.000386"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.205299" 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-04-25T23:55:18.207743" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.207531" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.207496" elapsed="0.000352"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.214742" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.214568" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.214543" elapsed="0.000296"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.216072" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.215670" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.216560" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.216261" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.216629" elapsed="0.000055"/>
</return>
<msg time="2026-04-25T23:55:18.216816" 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-04-25T23:55:18.215156" elapsed="0.001685"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.222600" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.222490" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.222467" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.223943" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.223836" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.223818" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.224524" 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-04-25T23:55:18.224157" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.224990" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.224735" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.225879" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.225565" elapsed="0.001334">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.227080" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.227126" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.225173" elapsed="0.001977"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.228084" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.227802" elapsed="0.001339">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.229320" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.229365" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.227378" elapsed="0.002010"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.230322" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.229718" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.229463" elapsed="0.001051">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.229444" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.230727" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.230953" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.230815" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.230797" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.231079" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.234133" elapsed="0.000147"/>
</kw>
<msg time="2026-04-25T23:55:18.234367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.233433" elapsed="0.001031"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.235462" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.236478" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.231950" elapsed="0.004646"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.231355" elapsed="0.005386"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.223513" elapsed="0.013314">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</status>
</kw>
<msg time="2026-04-25T23:55:18.236930" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.236972" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.222838" elapsed="0.014157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.237181" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.237072" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.237052" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.238252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.238147" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.238128" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.238623" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.238791" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.238494" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.239232" level="INFO">{1: 60}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.238970" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.239681" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.239425" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.240244" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:55:18.240719" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.240767" 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-04-25T23:55:18.239884" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.241596" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.243886" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.243456" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.242182" elapsed="0.002309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.246042" elapsed="0.000369"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.244751" elapsed="0.001722"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.241087" elapsed="0.005487"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.240867" elapsed="0.005758"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.240848" elapsed="0.005838"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.247614" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.247213" elapsed="0.000427"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.247705" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.247857" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.246893" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.248035" elapsed="0.000416"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.248755" level="INFO">index=61
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.248619" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.249028" elapsed="0.002450"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.251922" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.253042" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.251642" elapsed="0.001772">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.264113" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:55:18.264485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.262595" elapsed="0.001977"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.264928" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.265238" 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-04-25T23:55:18.254340" elapsed="0.011048"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.253807" elapsed="0.011630"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.237642" elapsed="0.027878">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.265883" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.265957" elapsed="0.000072"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.222132" elapsed="0.043994">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.266245" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.266289" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.217236" elapsed="0.049077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.266644" elapsed="0.000227"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.266391" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.266372" elapsed="0.000557"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.217091" elapsed="0.049861"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.216904" elapsed="0.050082"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.214030" elapsed="0.053012"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.207091" elapsed="0.060005"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.206402" elapsed="0.060739"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.200746" elapsed="0.066448"/>
</kw>
<kw name="Regexp Escape" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.267692" level="INFO">${escaped} = urn:ietf:params:xml:ns:netconf:base:1\.0</msg>
<var>${escaped}</var>
<arg>${ODL_NETCONF_NAMESPACE}</arg>
<doc>Returns each argument escaped for use as a regular expression.</doc>
<status status="PASS" start="2026-04-25T23:55:18.267356" elapsed="0.000363"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.269002" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.268607" 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-04-25T23:55:18.276303" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.276058" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.276757" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.276500" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.281510" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.278967" elapsed="0.004192">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.276866" elapsed="0.006374">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.283424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.283274" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.276848" elapsed="0.006666">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.283905" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.284036" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.284000" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.283983" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.284273" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.284344" 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-04-25T23:55:18.271609" elapsed="0.012838">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.284523" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.269239" elapsed="0.015378">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.284687" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.268346" elapsed="0.016435">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.285003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.284855" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.285221" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.285081" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.285436" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.285298" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.284839" elapsed="0.000676"/>
</if>
<arg>&lt;data xmlns\="${escaped}"(\/&gt;|&gt;&lt;\/data&gt;)</arg>
<arg>${True}</arg>
<status status="FAIL" start="2026-04-25T23:55:18.267924" elapsed="0.017668">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.199470" elapsed="0.086296">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t7" name="Create_Device_Data_Label_Via_Xml" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:18.289501" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.289241" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.290768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.290641" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.290623" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.295694" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.295574" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.295557" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.296746" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.296351" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.297226" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.296932" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.297296" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.297451" 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-04-25T23:55:18.295980" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.303023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.302915" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.302896" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.304295" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.304189" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.304171" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.304892" 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-04-25T23:55:18.304505" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.305318" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.305073" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.306408" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.305999" elapsed="0.001267">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.307444" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.307489" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.305507" elapsed="0.002005"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.308362" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.308096" elapsed="0.001263">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.309533" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.309578" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.307707" elapsed="0.001894"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.310523" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.309908" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.309691" elapsed="0.001019">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.309670" elapsed="0.001079">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.310912" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.311134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.310996" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.310979" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.311261" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.314246" elapsed="0.000155"/>
</kw>
<msg time="2026-04-25T23:55:18.314470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.313590" elapsed="0.000973"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.315478" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.316475" elapsed="0.000043"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.312109" elapsed="0.004489"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.311512" elapsed="0.005286"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.303884" elapsed="0.012999">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</status>
</kw>
<msg time="2026-04-25T23:55:18.316985" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.317029" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Device_Data_Label_Via_Xml"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.303240" elapsed="0.013812"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.317281" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.317171" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.317152" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.318165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.318058" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.318040" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.318494" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.318595" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.318381" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.319042" level="INFO">{1: 61}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.318787" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.319473" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.319233" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.320053" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:55:18.320466" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.320511" 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-04-25T23:55:18.319695" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.321489" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.323771" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.323172" elapsed="0.001128">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.321899" elapsed="0.002479"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.325906" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.324611" elapsed="0.001723"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.320997" elapsed="0.005437"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.320610" elapsed="0.005875"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.320591" elapsed="0.005920"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.327455" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.327054" elapsed="0.000428"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.327530" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.327710" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.326730" elapsed="0.001006"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.327891" elapsed="0.000397"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.328564" level="INFO">index=62
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.328455" elapsed="0.000274"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.328975" elapsed="0.002277"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.331692" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.332843" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.331412" elapsed="0.001798">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.343361" elapsed="0.000329"/>
</kw>
<msg time="2026-04-25T23:55:18.343748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.342051" elapsed="0.001784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.344157" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.344412" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.334014" elapsed="0.010537"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.333479" elapsed="0.011201"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.317746" elapsed="0.027021">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.345102" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.345176" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.302523" elapsed="0.042758">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.345387" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.345430" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.297855" elapsed="0.047598"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.346028" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.345533" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.345512" elapsed="0.000595"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.297714" elapsed="0.048416"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.297528" elapsed="0.048630"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.295217" elapsed="0.050995"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.290358" elapsed="0.055908"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.289927" elapsed="0.056384"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.286946" elapsed="0.059416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.346975" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:55:18.346525" elapsed="0.000477"/>
</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-04-25T23:55:18.381246" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.380873" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.382027" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.381799" elapsed="0.000290">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.382181" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.381443" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.382763" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.382365" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.383122" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:18.383285" 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-04-25T23:55:18.382984" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.383727" 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-04-25T23:55:18.383469" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.384732" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.384458" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.385193" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.384932" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.385892" 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-04-25T23:55:18.385565" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:18.386688" 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-04-25T23:55:18.386419" elapsed="0.000297"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:18.386766" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:55:18.386918" 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-04-25T23:55:18.386100" elapsed="0.000843"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.387091" elapsed="0.000225"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:18.385434" elapsed="0.001922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.387912" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:55:18.387597" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:18.388824" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.388575" elapsed="0.000275"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:18.388900" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.389052" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:55:18.388118" elapsed="0.000958"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.389224" elapsed="0.000222"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:55:18.387468" elapsed="0.002021"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:55:18.385267" elapsed="0.004256"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:55:18.389565" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:18.389756" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:55:18.384136" elapsed="0.005646"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.383840" elapsed="0.005974"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.389986" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.389839" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.383820" elapsed="0.006245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.390816" level="INFO">${final_text} = /restconf/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-04-25T23:55:18.390205" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:18.390892" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:18.380247" elapsed="0.010767"/>
</kw>
<msg time="2026-04-25T23:55:18.391067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.367601" elapsed="0.023512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.403522" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.416050" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.428316" 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-04-25T23:55:18.428508" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.428710" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.429103" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.428931" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.428916" elapsed="0.000269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.429322" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.429486" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.429674" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:18.428889" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.428788" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.429897" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.429971" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:55:18.430090" level="INFO">${uri} = /restconf/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-04-25T23:55:18.363123" elapsed="0.066993"/>
</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-04-25T23:55:18.454454" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.454081" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.455206" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.454985" elapsed="0.000285">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.455361" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.454640" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.456007" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.455601" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.456327" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:18.456501" 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-04-25T23:55:18.456193" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.456948" 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-04-25T23:55:18.456701" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:55:18.457349" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.457061" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.457904" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.457585" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.457432" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.457042" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.458753" 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-04-25T23:55:18.458130" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:18.458831" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:18.453441" elapsed="0.005516"/>
</kw>
<msg time="2026-04-25T23:55:18.459010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.440972" elapsed="0.018084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.471527" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.483965" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/dataorig/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.496164" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.496354" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.496524" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.496951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.496806" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.496791" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.497168" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.497358" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.497526" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:18.496762" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.496643" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.497764" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.497841" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:55:18.497957" 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-04-25T23:55:18.440114" elapsed="0.057870"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.499223" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.498992" elapsed="0.000293">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorig/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.499377" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.498639" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.499731" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.499472" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.500262" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.499973" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.499812" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.499453" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.502689" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.500492" elapsed="0.002224"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:55:18.502768" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.502922" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.498315" elapsed="0.004631"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.504458" level="INFO">/restconf/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-04-25T23:55:18.504213" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.505874" 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-04-25T23:55:18.504668" elapsed="0.001253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.506311" 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-04-25T23:55:18.506070" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.506753" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.506499" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.507580" 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-04-25T23:55:18.507390" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:55:18.507991" 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-04-25T23:55:18.507770" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.508167" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.508781" 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-04-25T23:55:18.508518" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:55:18.508867" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.509022" 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-04-25T23:55:18.506992" elapsed="0.002055"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.513852" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.511401" elapsed="0.004086">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.509118" elapsed="0.006462">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.515782" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.515614" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.509100" elapsed="0.006774">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.516237" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.516369" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.516334" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.516317" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.516569" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.516635" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.503272" elapsed="0.013482">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.516833" 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-04-25T23:55:18.351919" elapsed="0.165007">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.517214" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.517039" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.517022" elapsed="0.000335"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.517390" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}dataorig</arg>
<arg>${mapping}</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-04-25T23:55:18.347257" elapsed="0.170233">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.286060" elapsed="0.231573">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t8" name="Check_Device_Data_Label_Is_Created" line="81">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:18.521046" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.520786" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.522307" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.522199" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.522180" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.527359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.527254" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.527236" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.528408" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.528029" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.528910" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.528598" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.528980" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:18.529162" 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-04-25T23:55:18.527640" elapsed="0.001551"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.534602" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.534497" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.534478" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.535894" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.535788" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.535770" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.536456" 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-04-25T23:55:18.536101" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.536900" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.536638" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.537764" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.537485" elapsed="0.001130">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.538807" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.538853" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.537084" elapsed="0.001792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.539724" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.539427" elapsed="0.001319">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.540921" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.540966" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.539040" elapsed="0.001949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.543357" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.541331" elapsed="0.002111">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.541100" elapsed="0.002438">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.541080" elapsed="0.002493">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.543761" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.543990" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.543851" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.543833" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.544118" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.547139" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:55:18.547360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.546486" elapsed="0.000969"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.548382" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.549440" 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-04-25T23:55:18.544991" elapsed="0.004566"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.544373" elapsed="0.005315"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.535456" elapsed="0.014317">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:55:18.549874" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.549917" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.534831" elapsed="0.015109"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.550120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.550015" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.549996" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.550973" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.550870" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.550852" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.551297" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.551398" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.551183" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.551856" level="INFO">{1: 62}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.551572" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.552287" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.552048" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.552955" elapsed="0.000327"/>
</kw>
<msg time="2026-04-25T23:55:18.553385" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.553430" 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-04-25T23:55:18.552484" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.554263" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.556388" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.555973" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.554672" elapsed="0.002470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.558638" elapsed="0.000366"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.557412" elapsed="0.001654"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.553759" elapsed="0.005407"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.553526" elapsed="0.005691"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.553509" elapsed="0.005734"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.560192" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.559790" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.560267" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.560419" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.559442" elapsed="0.001001"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.560594" elapsed="0.000480"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.561360" level="INFO">index=63
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.561252" elapsed="0.000428"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.561828" elapsed="0.002231"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.564474" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.565465" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.564219" elapsed="0.001634">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.576198" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:55:18.576572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.574851" elapsed="0.002075"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.577317" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.577586" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.566624" elapsed="0.011124"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.566121" elapsed="0.011676"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.550566" elapsed="0.027313">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.578206" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.578278" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.534163" elapsed="0.044217">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.578484" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.578530" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.529572" elapsed="0.048981"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.578939" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.578687" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.578667" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.529432" elapsed="0.049606"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.529260" elapsed="0.049808"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.526895" elapsed="0.052226"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.521915" elapsed="0.057289"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.521477" elapsed="0.057779"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.518497" elapsed="0.060811"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.580570" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.580180" 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-04-25T23:55:18.588213" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.587964" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.588669" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.588411" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.593158" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.590853" elapsed="0.003936">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.588782" elapsed="0.006088">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.595054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.594904" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.588763" elapsed="0.006378">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.595509" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.595638" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.595601" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.595585" 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-04-25T23:55:18.595856" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.595923" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.583284" elapsed="0.012741">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.596142" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.580935" elapsed="0.015306">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.596295" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.579919" elapsed="0.016467">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.596610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.596459" elapsed="0.000226"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.596851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.596709" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.597081" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.596927" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.596443" elapsed="0.000715"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:18.579507" elapsed="0.017729">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.517942" elapsed="0.079431">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t9" name="Modify_Device_Data_Label_Via_Xml" line="86">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:18.600932" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.600666" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.602250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.602132" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.602112" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.607403" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.607297" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.607279" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.608477" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.608084" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.608996" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.608682" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.609067" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:18.609229" 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-04-25T23:55:18.607709" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.614715" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.614592" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.614574" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.616011" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.615905" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.615887" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.616588" level="INFO">${karaf_connection_index} = 63</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.616220" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.617125" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.616841" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.618002" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.617715" elapsed="0.001226">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.619125" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.619171" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.617311" elapsed="0.001884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.620055" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.619777" elapsed="0.001319">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.621273" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.621319" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.619362" elapsed="0.001981"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.622256" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.621637" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.621418" elapsed="0.001013">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.621399" elapsed="0.001218">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.622797" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.623028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.622887" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.622870" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.623157" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.626245" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:55:18.626473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.625553" elapsed="0.001013"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.627556" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.628533" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.624030" elapsed="0.004705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.623424" elapsed="0.005437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.615571" elapsed="0.013377">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</status>
</kw>
<msg time="2026-04-25T23:55:18.629049" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.629093" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Xml"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.614929" elapsed="0.014188"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.629348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.629194" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.629175" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.630214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.630110" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.630093" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.630555" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.630672" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.630431" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.631149" level="INFO">{1: 63}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.630888" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.631587" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.631345" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.632172" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:55:18.632592" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.632638" level="INFO">${old_connection_index} = 63</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.631814" elapsed="0.001005"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.633623" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.635728" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.635283" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.634030" elapsed="0.002305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.637903" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.636568" elapsed="0.001751"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.633126" elapsed="0.005293"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.632905" elapsed="0.005565"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.632886" elapsed="0.005610"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.639441" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.639039" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.639517" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.639696" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.638718" elapsed="0.001005"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.639877" elapsed="0.000420"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.640576" level="INFO">index=64
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.640466" elapsed="0.000360"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.640976" elapsed="0.002432"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.643862" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.644885" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.643572" elapsed="0.001682">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.655478" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:55:18.655870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.653971" elapsed="0.001987"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.656339" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.656598" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.646083" elapsed="0.010685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.645524" elapsed="0.011294"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.629821" elapsed="0.027113">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.657266" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.657339" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.614257" elapsed="0.043183">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.657548" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.657591" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.609638" elapsed="0.047976"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.657970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.657719" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.657700" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.609496" elapsed="0.048573"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.609313" elapsed="0.048788"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.606936" elapsed="0.051219"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.601839" elapsed="0.056370"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.601391" elapsed="0.056863"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.598334" elapsed="0.059972"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.659100" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:55:18.658478" elapsed="0.000649"/>
</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-04-25T23:55:18.692796" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.692380" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.693542" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.693319" elapsed="0.000284">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.693712" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.692989" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.694288" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.693902" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.694631" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:18.694795" 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-04-25T23:55:18.694492" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.695217" 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-04-25T23:55:18.694975" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.696258" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.696002" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.696750" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.696459" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.697431" 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-04-25T23:55:18.697132" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:18.698216" 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-04-25T23:55:18.697974" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:18.698291" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.698442" 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-04-25T23:55:18.697640" elapsed="0.000827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.698622" elapsed="0.000252"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:18.696998" elapsed="0.001916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.699454" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:55:18.699157" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:18.700228" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.699993" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:18.700303" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:18.700451" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:55:18.699678" 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-04-25T23:55:18.700663" elapsed="0.000224"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:55:18.699026" elapsed="0.001902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:55:18.696827" elapsed="0.004135"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:55:18.701004" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:18.701160" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:55:18.695677" elapsed="0.005509"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.695359" elapsed="0.005858"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.701390" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.701242" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.695308" elapsed="0.006157"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.702190" level="INFO">${final_text} = /restconf/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-04-25T23:55:18.701607" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:18.702266" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:18.691761" elapsed="0.010628"/>
</kw>
<msg time="2026-04-25T23:55:18.702443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.678937" elapsed="0.023553"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.715212" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.727578" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.739888" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.740081" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.740254" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.740631" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.740488" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.740473" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.740865" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.741030" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.741193" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:18.740444" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.740331" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.741415" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.741488" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:55:18.741605" level="INFO">${uri} = /restconf/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-04-25T23:55:18.674622" elapsed="0.067008"/>
</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-04-25T23:55:18.767865" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.767470" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.768617" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.768404" elapsed="0.000295">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.768794" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.768056" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.769372" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.768983" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.769714" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:18.769881" 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-04-25T23:55:18.769561" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.770316" 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-04-25T23:55:18.770066" 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-04-25T23:55:18.770754" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.770431" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.771290" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.770986" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.770840" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.770411" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.771997" 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-04-25T23:55:18.771524" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:18.772076" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:18.766843" elapsed="0.005363"/>
</kw>
<msg time="2026-04-25T23:55:18.772262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.754226" elapsed="0.018084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.786680" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.800080" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.816397" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.816596" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.816791" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.817173" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.817028" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.817013" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.817392" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.817556" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.817732" elapsed="0.000065"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:18.816983" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.816871" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.818010" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.818086" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:55:18.818213" 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-04-25T23:55:18.751592" elapsed="0.066648"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:18.819539" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:55:18.819290" elapsed="0.000316">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:18.819716" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:18.818935" 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-04-25T23:55:18.820060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.819812" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.820624" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.820330" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.820140" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.819794" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.823047" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.820875" elapsed="0.002199"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:55:18.823125" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.823278" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:55:18.818582" elapsed="0.004721"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.824739" level="INFO">/restconf/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-04-25T23:55:18.824469" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.825175" 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-04-25T23:55:18.824938" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.825611" 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-04-25T23:55:18.825370" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.826057" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.825820" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.826914" 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-04-25T23:55:18.826713" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:55:18.827263" 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-04-25T23:55:18.827090" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.827435" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.828058" 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-04-25T23:55:18.827813" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:55:18.828158" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.828313" 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-04-25T23:55:18.826299" elapsed="0.002039"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.833379" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.830718" elapsed="0.004351">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.828447" elapsed="0.006710">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.835341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.835190" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.828428" elapsed="0.007003">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.835818" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.835948" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.835911" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.835895" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.836162" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.836229" 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-04-25T23:55:18.823635" elapsed="0.012697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.836407" 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-04-25T23:55:18.663730" elapsed="0.172776">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:18.836806" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.836615" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.836598" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.836926" elapsed="0.000013"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</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-04-25T23:55:18.659382" elapsed="0.177637">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to change the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.597755" elapsed="0.239423">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t10" name="Check_Device_Data_Label_Is_Modified" 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-04-25T23:55:18.840611" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.840346" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.841871" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.841763" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.841745" elapsed="0.000191"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.847107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.847002" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.846985" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.848171" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.847779" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.848667" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.848355" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.848740" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.848894" 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-04-25T23:55:18.847395" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.854468" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.854346" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.854325" elapsed="0.000371"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.856208" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.856065" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.856000" elapsed="0.000298"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.856906" level="INFO">${karaf_connection_index} = 64</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.856463" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.857409" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.857121" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.858411" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.858090" elapsed="0.001405">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.859737" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.859789" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.857625" elapsed="0.002189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.860846" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.860491" elapsed="0.001413">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.862081" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.862126" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.860031" elapsed="0.002118"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.863210" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.862446" elapsed="0.000843">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.862223" elapsed="0.001160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.862204" elapsed="0.001215">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.863577" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.863869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.863689" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.863645" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.864016" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.867043" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:55:18.867266" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.866380" 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-04-25T23:55:18.868341" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.869363" 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-04-25T23:55:18.864947" elapsed="0.004531"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.864288" elapsed="0.005304"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.855633" elapsed="0.014060">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</status>
</kw>
<msg time="2026-04-25T23:55:18.869797" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.869840" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.854879" elapsed="0.014984"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.870046" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.869939" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.869920" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.870909" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.870804" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.870786" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.871250" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.871353" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.871121" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.871814" level="INFO">{1: 64}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.871527" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.872257" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.872016" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.872938" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:55:18.873351" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.873396" level="INFO">${old_connection_index} = 64</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.872454" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.874230" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.876379" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.875957" elapsed="0.001090">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.874627" elapsed="0.002496"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.878617" elapsed="0.000381"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.877360" elapsed="0.001701"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.873728" elapsed="0.005435"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.873492" elapsed="0.005723"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.873474" elapsed="0.005804"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.880325" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.879875" elapsed="0.000477"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.880401" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:18.880551" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.879489" elapsed="0.001086"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.880811" elapsed="0.002126"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.883225" level="INFO">index=65
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.883112" 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-04-25T23:55:18.883498" elapsed="0.002545"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.886464" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.887330" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.886205" elapsed="0.001532">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.898220" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:55:18.898596" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.896596" elapsed="0.002125"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.899069" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.899331" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.888526" elapsed="0.010951"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.888020" elapsed="0.011505"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.870497" elapsed="0.029110">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.900044" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.900120" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.853965" elapsed="0.046258">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.900326" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.900368" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.849280" elapsed="0.051111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.900934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.900472" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.900451" elapsed="0.000562"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.849141" elapsed="0.051895"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.848970" elapsed="0.052096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.846631" elapsed="0.054488"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.841462" elapsed="0.059710"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.841045" elapsed="0.060170"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.838097" elapsed="0.063204"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.902546" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:18.902157" elapsed="0.000415"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.917682" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.917339" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.918163" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.917910" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:18.922972" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.920440" elapsed="0.004268">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.918290" elapsed="0.006505">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.924986" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.924833" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.918264" elapsed="0.006811">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.925462" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.925595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.925557" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.925541" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.925822" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.925891" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.907165" elapsed="0.018834">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.926069" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.902796" elapsed="0.023367">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.926219" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.901901" elapsed="0.024409">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.926532" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.926384" elapsed="0.000258"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.926827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.926682" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.927041" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.926903" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.926368" elapsed="0.000747"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:18.901504" elapsed="0.025692">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.837427" elapsed="0.089928">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t11" name="Deconfigure_Device_From_Netconf_Temporarily" line="96">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:18.931123" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:18.930862" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.932414" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.932303" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.932284" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.937626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.937519" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.937501" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.938721" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:18.938312" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.939203" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:18.938908" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:18.939273" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:18.939445" 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-04-25T23:55:18.937935" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.945181" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.945073" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.945054" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.946554" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.946422" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.946400" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.947155" level="INFO">${karaf_connection_index} = 65</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.946792" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.947594" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.947340" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.948472" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.948190" elapsed="0.001192">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.949564" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:18.949610" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.947804" elapsed="0.001829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.950525" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.950204" elapsed="0.001385">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:18.951821" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:18.951866" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.949818" elapsed="0.002071"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.952853" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.952183" elapsed="0.000752">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:18.951963" elapsed="0.001063">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:18.951944" elapsed="0.001264">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.953370" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.953595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.953456" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:18.953439" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.953740" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.956964" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:55:18.957189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.956256" elapsed="0.001027"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.958256" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.959237" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.954756" elapsed="0.004595"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.954012" elapsed="0.005453"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.946115" elapsed="0.013434">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</status>
</kw>
<msg time="2026-04-25T23:55:18.959745" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.959792" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf_Temporarily"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.945398" elapsed="0.014418"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.960001" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.959894" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.959875" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.960869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:18.960764" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.960747" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.961217" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.961320" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:18.961087" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.961811" level="INFO">{1: 65}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.961523" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:18.962244" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:18.962004" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.962846" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:55:18.963261" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:18.963345" level="INFO">${old_connection_index} = 65</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.962456" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.964316" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.966443" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.966022" elapsed="0.001001">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.964727" elapsed="0.002372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.968714" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.967335" elapsed="0.001801"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:18.963805" elapsed="0.005434"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:18.963447" elapsed="0.005844"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.963428" elapsed="0.005890"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.970270" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.969868" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:18.970347" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:18.970506" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.969523" elapsed="0.001008"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:18.970700" elapsed="0.000426"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.971408" level="INFO">index=66
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:18.971297" 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-04-25T23:55:18.971722" elapsed="0.002458"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:18.974602" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:18.975466" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.974341" elapsed="0.001645">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:18.986453" elapsed="0.000336"/>
</kw>
<msg time="2026-04-25T23:55:18.986873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:18.984849" elapsed="0.002117"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.987297" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.987572" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:18.976785" elapsed="0.011021"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:18.976258" elapsed="0.011600"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.960457" elapsed="0.027484">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.988271" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:18.988344" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:18.944734" elapsed="0.043713">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:18.988600" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:18.988643" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.939925" elapsed="0.048756"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:18.989008" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:18.988758" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:18.988740" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:18.939781" elapsed="0.049328"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:18.939548" elapsed="0.049592"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:18.937149" elapsed="0.052046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:18.932013" elapsed="0.057237"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:18.931547" elapsed="0.057747"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:18.928688" elapsed="0.060658"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:18.990471" level="FAIL">Dictionary does not contain key 'netconf-test-device'.</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="FAIL" start="2026-04-25T23:55:18.990226" elapsed="0.000306">Dictionary does not contain key 'netconf-test-device'.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:18.990721" elapsed="0.000022"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<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="NOT RUN" start="2026-04-25T23:55:18.999284" elapsed="0.000028"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-25T23:55:18.999545" elapsed="0.000024"/>
</kw>
<arg>${device_name}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="FAIL" start="2026-04-25T23:55:18.989588" elapsed="0.010091">Dictionary does not contain key 'netconf-test-device'.</status>
</kw>
<doc>Make request to deconfigure the testtool device on Netconf connector.
This is the first part of the "configure/deconfigure" cycle of the device
The purpose of cycling the device like this is to see that the configuration
data was really stored in the device.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:55:18.927726" elapsed="0.072086">Dictionary does not contain key 'netconf-test-device'.</status>
</test>
<test id="s1-s4-s2-t12" name="Wait_For_Device_To_Be_Gone" line="105">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:19.003064" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:19.002807" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.004325" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.004215" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.004196" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.009476" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.009369" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.009350" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.010532" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:19.010153" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.011025" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:19.010731" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:19.011095" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:19.011249" 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-04-25T23:55:19.009780" 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-04-25T23:55:19.016771" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.016641" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.016584" elapsed="0.000256"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.018054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.017946" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.017928" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:19.018614" level="INFO">${karaf_connection_index} = 66</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:19.018261" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.019058" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:19.018814" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.019936" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.019648" elapsed="0.001182">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:19.021006" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:19.021052" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.019240" elapsed="0.001835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.021930" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.021631" elapsed="0.001333">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:19.023139" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:19.023185" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.021241" elapsed="0.001967"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.024142" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.023518" elapsed="0.000702">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:19.023284" elapsed="0.001030">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:19.023264" elapsed="0.001247">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.024693" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.024922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:19.024783" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:19.024766" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.025051" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:19.028011" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:55:19.028233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:19.027367" elapsed="0.000960"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.029244" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.030259" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:19.025915" elapsed="0.004464"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:19.025319" elapsed="0.005172"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.017619" elapsed="0.012958">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</status>
</kw>
<msg time="2026-04-25T23:55:19.030786" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:19.030831" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Be_Gone"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.016991" elapsed="0.013863"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.031079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.030969" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.030950" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.031976" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.031868" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.031850" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.032316" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:19.032418" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:19.032192" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.032871" level="INFO">{1: 66}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:19.032594" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.033307" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:19.033066" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:19.033878" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:55:19.034294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:19.034339" level="INFO">${old_connection_index} = 66</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.033505" elapsed="0.000857"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:19.035277" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.037387" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.036969" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.035706" elapsed="0.002317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:19.039532" elapsed="0.000478"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.038254" elapsed="0.001820"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:19.034771" elapsed="0.005402"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:19.034437" elapsed="0.005788"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.034419" elapsed="0.005832"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:19.041192" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:19.040789" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:19.041267" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:19.041415" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:19.040452" elapsed="0.000987"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:19.041591" elapsed="0.000435"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.042301" level="INFO">index=67
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:19.042193" 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-04-25T23:55:19.042568" elapsed="0.002451"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:19.045443" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:19.046345" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.045182" elapsed="0.001717">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:19.056939" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:55:19.057316" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:19.055583" elapsed="0.001821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.057751" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.058014" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:19.047716" elapsed="0.010440"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:19.047172" elapsed="0.011032"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.031556" elapsed="0.026732">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.058622" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.058906" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.016268" elapsed="0.042747">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:19.059121" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:19.059165" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.011665" elapsed="0.047523"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.059539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:19.059266" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.059248" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:19.011512" elapsed="0.048127"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:19.011325" elapsed="0.048362"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:19.009007" elapsed="0.050741"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:19.003929" elapsed="0.055876"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:19.003469" elapsed="0.056382"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:19.000671" elapsed="0.059233"/>
</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-04-25T23:55:19.072866" 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-04-25T23:55:19.070760" elapsed="0.002133"/>
</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-04-25T23:55:19.073221" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:19.073070" elapsed="0.000207"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.072949" 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-04-25T23:55:19.073603" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:19.073365" 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-04-25T23:55:19.074395" level="INFO">${uri} = /restconf/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-04-25T23:55:19.073928" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:19.073699" 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-04-25T23:55:19.074645" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:19.074483" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:19.073347" elapsed="0.001388"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:19.074803" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:19.074954" level="INFO">${uri} = /restconf/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-04-25T23:55:19.070292" elapsed="0.004687"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:19.075026" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:19.075167" level="INFO">${uri} = /restconf/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-04-25T23:55:19.069810" elapsed="0.005381"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.082452" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:19.082203" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:19.082905" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:19.082648" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:19.087606" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.085072" elapsed="0.004172">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:19.083015" elapsed="0.006310">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.089513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:19.089360" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:19.082997" elapsed="0.006602">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.089989" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.090119" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:19.090083" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:19.090067" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.090317" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.090384" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.077899" elapsed="0.012589">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.090558" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:19.075435" elapsed="0.015231">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.090837" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:19.091000" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:19.091061" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:55:19.062047" elapsed="0.029110">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.091374" elapsed="0.000024"/>
</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="FAIL" start="2026-04-25T23:55:19.061585" elapsed="0.029902">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:19.098711" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:19.102249" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:19.061088" elapsed="0.041286">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:20.119766" 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-04-25T23:55:20.117648" elapsed="0.002146"/>
</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-04-25T23:55:20.120140" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:20.119988" elapsed="0.000210"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:20.119866" 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-04-25T23:55:20.120538" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:20.120290" 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-04-25T23:55:20.121337" level="INFO">${uri} = /restconf/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-04-25T23:55:20.120863" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:20.120618" 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-04-25T23:55:20.121586" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:20.121424" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:20.120271" elapsed="0.001403"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:20.121711" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:20.121866" level="INFO">${uri} = /restconf/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-04-25T23:55:20.117194" elapsed="0.004697"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:20.121936" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:20.122076" level="INFO">${uri} = /restconf/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-04-25T23:55:20.116716" elapsed="0.005384"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:20.129560" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:20.129303" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:20.130018" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:20.129773" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:20.134965" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:20.132182" elapsed="0.004442">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:20.130127" elapsed="0.006598">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.136958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:20.136801" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:20.130108" elapsed="0.006938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.137418" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:20.137553" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:20.137517" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:20.137498" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.137770" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:20.137840" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:20.124735" elapsed="0.013212">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:20.138018" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:55:20.122316" elapsed="0.015797">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.138281" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:20.138446" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:20.138507" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:20.105399" elapsed="0.033211">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.138787" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:20.104377" elapsed="0.034520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:20.145967" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:20.149468" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:20.103077" elapsed="0.046513">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:21.167011" 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-04-25T23:55:21.164613" elapsed="0.002427"/>
</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-04-25T23:55:21.167424" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:21.167270" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:21.167144" elapsed="0.000364"/>
</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-04-25T23:55:21.167841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:21.167573" 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-04-25T23:55:21.168624" level="INFO">${uri} = /restconf/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-04-25T23:55:21.168150" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:21.167922" 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-04-25T23:55:21.168893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:21.168729" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:21.167554" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:21.169014" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:21.169169" level="INFO">${uri} = /restconf/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-04-25T23:55:21.163979" elapsed="0.005215"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:21.169240" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:21.169380" level="INFO">${uri} = /restconf/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-04-25T23:55:21.163292" elapsed="0.006112"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:21.176550" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:21.176297" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:21.177027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:21.176760" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:21.181628" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:21.179175" elapsed="0.004092">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:21.177138" elapsed="0.006214">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.183540" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:21.183386" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:21.177119" elapsed="0.006507">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.184006" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:21.184136" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:21.184100" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:21.184083" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.184335" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:21.184403" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:21.172013" elapsed="0.012495">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:21.184614" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:55:21.169624" elapsed="0.015106">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.184913" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:21.185079" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:21.185142" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:21.152490" elapsed="0.032751">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.185402" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:21.151466" elapsed="0.034044">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:21.194718" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:21.198351" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:55:21.150237" elapsed="0.048239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:22.215473" 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-04-25T23:55:22.213364" elapsed="0.002138"/>
</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-04-25T23:55:22.215845" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:22.215692" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:22.215560" 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-04-25T23:55:22.216238" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:22.215994" 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-04-25T23:55:22.217045" level="INFO">${uri} = /restconf/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-04-25T23:55:22.216549" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:22.216319" 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-04-25T23:55:22.217297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:22.217134" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:22.215976" elapsed="0.001398"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:22.217408" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:22.217561" level="INFO">${uri} = /restconf/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-04-25T23:55:22.212906" elapsed="0.004681"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:22.217634" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:55:22.217795" level="INFO">${uri} = /restconf/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-04-25T23:55:22.212385" elapsed="0.005435"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:22.225401" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:22.225142" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:22.225870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:22.225603" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:22.230523" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:22.228041" elapsed="0.004121">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:22.225982" elapsed="0.006264">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.232430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:22.232279" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:22.225964" elapsed="0.006554">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.232902" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:22.233033" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:22.232997" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:22.232980" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.233232" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:22.233300" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:22.220508" elapsed="0.012896">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:22.233475" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:22.218097" elapsed="0.015472">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.233753" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:22.233920" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:22.233982" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:55:22.201494" elapsed="0.032585">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.234239" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:22.200465" elapsed="0.033882">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:22.241476" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:22.245004" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:22.199254" elapsed="0.045873">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:23.263261" 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-04-25T23:55:23.260901" elapsed="0.002393"/>
</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-04-25T23:55:23.263645" elapsed="0.000040"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:23.263489" elapsed="0.000233"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:23.263362" elapsed="0.000389"/>
</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-04-25T23:55:23.264083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:23.263820" 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-04-25T23:55:23.264902" level="INFO">${uri} = /restconf/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-04-25T23:55:23.264395" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:23.264165" 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-04-25T23:55:23.265155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:23.264990" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:23.263800" elapsed="0.001431"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:23.265268" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:55:23.265430" level="INFO">${uri} = /restconf/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-04-25T23:55:23.260184" elapsed="0.005271"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:23.265501" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:55:23.265643" level="INFO">${uri} = /restconf/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-04-25T23:55:23.259473" elapsed="0.006210"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:23.272941" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:23.272679" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:23.273381" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:23.273138" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:23.278343" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:23.275535" elapsed="0.004543">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:23.273491" elapsed="0.006675">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.280350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:23.280200" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:23.273473" elapsed="0.007034">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.280905" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:23.281036" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:23.281000" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:23.280983" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.281236" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:23.281304" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:23.268314" elapsed="0.013098">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:23.281483" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:23.265902" elapsed="0.015676">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.281767" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:23.281934" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:23.281996" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:55:23.248402" elapsed="0.033691">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.282255" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:23.247355" elapsed="0.035007">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:23.289685" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:23.293237" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:23.246022" elapsed="0.047339">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:24.314187" 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-04-25T23:55:24.311168" elapsed="0.003066"/>
</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-04-25T23:55:24.314842" elapsed="0.000034"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:24.314564" elapsed="0.000363"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:24.314335" elapsed="0.000634"/>
</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-04-25T23:55:24.315440" elapsed="0.000142"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:24.315075" elapsed="0.000569"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:24.316416" level="INFO">${uri} = /restconf/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-04-25T23:55:24.315929" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:24.315689" 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-04-25T23:55:24.316693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:24.316506" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:24.315045" elapsed="0.001728"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:24.316812" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:55:24.316980" level="INFO">${uri} = /restconf/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-04-25T23:55:24.310460" elapsed="0.006547"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:24.317054" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:24.317198" level="INFO">${uri} = /restconf/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-04-25T23:55:24.309754" elapsed="0.007470"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:24.324671" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:24.324392" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:24.325118" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:24.324872" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:24.330056" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:24.327301" elapsed="0.004474">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:24.325230" elapsed="0.006634">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:24.332051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:24.331899" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:24.325211" elapsed="0.006929">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:24.332522" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:24.332665" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:24.332615" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:24.332599" 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-04-25T23:55:24.332871" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:24.332940" 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-04-25T23:55:24.319893" elapsed="0.013154">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:24.333119" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:24.317443" elapsed="0.015772">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:24.333421" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:24.333590" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:24.333668" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:55:24.296768" elapsed="0.037003">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:24.333936" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:55:24.295704" elapsed="0.038342">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:24.341183" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:24.344751" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:24.294274" elapsed="0.050601">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:25.363145" 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-04-25T23:55:25.360700" elapsed="0.002477"/>
</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-04-25T23:55:25.363525" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:25.363372" elapsed="0.000211"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:25.363244" 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-04-25T23:55:25.363991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:25.363713" 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-04-25T23:55:25.364796" level="INFO">${uri} = /restconf/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-04-25T23:55:25.364303" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:25.364073" elapsed="0.000787"/>
</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-04-25T23:55:25.365049" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:25.364885" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:25.363687" elapsed="0.001439"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:25.365162" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:25.365331" level="INFO">${uri} = /restconf/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-04-25T23:55:25.360027" elapsed="0.005331"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:25.365406" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:25.365550" level="INFO">${uri} = /restconf/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-04-25T23:55:25.359319" elapsed="0.006257"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:25.372824" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:25.372546" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:25.373268" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:25.373024" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:25.378177" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:25.375539" elapsed="0.004381">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:25.373473" elapsed="0.006533">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.380193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:25.380041" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:25.373453" elapsed="0.006828">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.380649" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:25.380800" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:25.380762" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:25.380745" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.381002" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:25.381072" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:25.368222" elapsed="0.012956">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:25.381250" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:55:25.365808" elapsed="0.015555">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.381533" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:25.381714" elapsed="0.000022"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:25.381779" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:25.348136" elapsed="0.033742">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.382042" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:25.347097" elapsed="0.035054">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:25.389472" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:25.393019" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:25.345769" elapsed="0.047407">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:26.413827" 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-04-25T23:55:26.411686" elapsed="0.002173"/>
</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-04-25T23:55:26.414206" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:26.414050" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:26.413924" 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-04-25T23:55:26.414629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:26.414360" 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-04-25T23:55:26.415438" level="INFO">${uri} = /restconf/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-04-25T23:55:26.414959" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:26.414727" 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-04-25T23:55:26.415707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:26.415527" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:26.414341" elapsed="0.001445"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:26.415822" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:26.415983" level="INFO">${uri} = /restconf/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-04-25T23:55:26.411195" elapsed="0.004878"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:26.416124" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:26.416282" level="INFO">${uri} = /restconf/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-04-25T23:55:26.410702" elapsed="0.005606"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:26.423857" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:26.423573" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:26.424320" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:26.424060" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:26.429083" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:26.426485" elapsed="0.004298">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:26.424433" elapsed="0.006434">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.431053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:26.430902" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:26.424414" elapsed="0.006726">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.431517" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:26.431721" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:26.431610" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:26.431593" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.431934" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:26.432006" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:26.418947" elapsed="0.013167">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:26.432200" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:55:26.416528" elapsed="0.015772">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.432472" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:26.432640" elapsed="0.000041"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:26.432727" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:55:26.396364" elapsed="0.036469">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.432998" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:55:26.395271" elapsed="0.037838">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:26.440244" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:26.443751" elapsed="0.000025"/>
</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="FAIL" start="2026-04-25T23:55:26.393965" elapsed="0.049910">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:27.461477" 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-04-25T23:55:27.459161" elapsed="0.002347"/>
</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-04-25T23:55:27.461870" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:27.461710" elapsed="0.000219"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:27.461572" 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-04-25T23:55:27.462277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:27.462021" 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-04-25T23:55:27.463081" level="INFO">${uri} = /restconf/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-04-25T23:55:27.462588" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:27.462358" elapsed="0.000787"/>
</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-04-25T23:55:27.463409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:27.463241" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:27.462002" elapsed="0.001485"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:27.463522" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:55:27.463696" level="INFO">${uri} = /restconf/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-04-25T23:55:27.458487" elapsed="0.005241"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:27.463776" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:27.463920" level="INFO">${uri} = /restconf/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-04-25T23:55:27.457810" elapsed="0.006136"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:27.471154" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:27.470898" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:27.471618" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:27.471374" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:27.476422" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:27.473792" elapsed="0.004304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:27.471746" elapsed="0.006435">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.478366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:27.478215" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:27.471728" elapsed="0.006726">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.478835" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:27.478967" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:27.478931" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:27.478914" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.479168" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:27.479253" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:27.466560" elapsed="0.012799">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:27.479430" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:55:27.464164" elapsed="0.015362">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.479728" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:27.479897" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:27.479961" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:27.446898" elapsed="0.033161">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.480262" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:55:27.445862" elapsed="0.034512">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:27.487695" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:27.491224" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:27.444583" elapsed="0.046766">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:28.512126" 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-04-25T23:55:28.509913" elapsed="0.002249"/>
</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-04-25T23:55:28.512547" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:28.512388" elapsed="0.000217"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:28.512245" elapsed="0.000392"/>
</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-04-25T23:55:28.513005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:28.512734" 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-04-25T23:55:28.513811" level="INFO">${uri} = /restconf/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-04-25T23:55:28.513318" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:28.513090" 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-04-25T23:55:28.514063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:28.513900" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:28.512712" elapsed="0.001427"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:28.514180" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:55:28.514351" level="INFO">${uri} = /restconf/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-04-25T23:55:28.509400" elapsed="0.004977"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:28.514424" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:28.514587" level="INFO">${uri} = /restconf/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-04-25T23:55:28.508873" elapsed="0.005740"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:28.522022" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:28.521757" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:28.522464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:28.522222" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:28.527588" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:28.524648" elapsed="0.004661">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:28.522593" elapsed="0.006879">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.529678" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:28.529509" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:28.522575" elapsed="0.007194">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.530148" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:28.530279" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:28.530242" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:28.530226" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.530494" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:28.530564" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:28.517270" elapsed="0.013417">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:28.530761" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:55:28.514854" elapsed="0.016004">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.531025" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:28.531190" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:28.531252" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:55:28.494743" elapsed="0.036606">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.531512" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:55:28.493608" elapsed="0.038011">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:28.538804" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:28.542382" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:55:28.492237" elapsed="0.050283">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:55:29.561646" 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-04-25T23:55:29.559461" elapsed="0.002233"/>
</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-04-25T23:55:29.562090" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:55:29.561916" elapsed="0.000233"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.561774" elapsed="0.000406"/>
</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-04-25T23:55:29.562527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.562260" 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-04-25T23:55:29.563327" level="INFO">${uri} = /restconf/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-04-25T23:55:29.562855" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.562610" 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-04-25T23:55:29.563576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.563414" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.562236" elapsed="0.001434"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:29.563712" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:55:29.563889" level="INFO">${uri} = /restconf/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-04-25T23:55:29.558969" elapsed="0.004945"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:29.563962" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:29.564103" level="INFO">${uri} = /restconf/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-04-25T23:55:29.558433" elapsed="0.005695"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.571356" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.571097" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.571814" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.571553" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:29.577052" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.574030" elapsed="0.005424">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.571924" elapsed="0.007651">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.579861" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.579622" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.571905" elapsed="0.008091">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.580509" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.580719" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.580642" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.580618" 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-04-25T23:55:29.581015" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.581116" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.566823" elapsed="0.014516">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.581441" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-25T23:55:29.564345" elapsed="0.017232">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.581849" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:55:29.582115" elapsed="0.000030"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.582205" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-25T23:55:29.545913" elapsed="0.036433">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.582572" elapsed="0.000029"/>
</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="FAIL" start="2026-04-25T23:55:29.544869" elapsed="0.038102">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:55:29.593263" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.596896" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:55:29.543436" elapsed="0.053595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:55:29.597134" level="FAIL">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:55:19.060519" elapsed="10.536723">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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="FAIL" start="2026-04-25T23:55:19.060118" elapsed="10.537251">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait for the device to completely disappear.</doc>
<status status="FAIL" start="2026-04-25T23:55:19.000210" elapsed="10.597323">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t13" name="Configure_The_Device_Back" line="109">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:29.601140" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:29.600862" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.602518" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.602397" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.602376" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.607642" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.607536" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.607517" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.608737" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:29.608331" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.609221" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:29.608924" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:29.609291" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:55:29.609448" 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-04-25T23:55:29.607955" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.615076" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.614969" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.614950" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.616361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.616255" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.616237" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:29.616955" 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-04-25T23:55:29.616572" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.617399" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.617142" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.618283" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.618002" elapsed="0.001174">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:29.619359" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:29.619404" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.617582" elapsed="0.001845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.620310" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.620033" elapsed="0.001300">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:29.621509" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:29.621554" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.619592" elapsed="0.001985"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.622517" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.621916" elapsed="0.000680">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.621674" elapsed="0.001030">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.621633" elapsed="0.001106">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.622899" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.623126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.622986" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.622968" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.623291" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.626356" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:55:29.626582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.625620" elapsed="0.001072"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.627641" elapsed="0.000050"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.628590" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:29.624154" elapsed="0.004564"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:29.623552" elapsed="0.005288"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.615952" elapsed="0.012974">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</status>
</kw>
<msg time="2026-04-25T23:55:29.629028" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:29.629071" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Configure_The_Device_Back"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.615293" elapsed="0.013802"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.629278" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.629171" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.629153" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.630411" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.630305" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.630286" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.630777" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:29.630880" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:29.630628" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.631317" level="INFO">{1: 67}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.631057" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.631771" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.631510" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.632330" elapsed="0.000432"/>
</kw>
<msg time="2026-04-25T23:55:29.632864" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:29.632910" level="INFO">${old_connection_index} = 67</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.631972" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.633840" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.635988" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.635544" elapsed="0.000978">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.634262" elapsed="0.002337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:29.638253" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.636859" elapsed="0.001838"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:29.633230" elapsed="0.005573"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.633010" elapsed="0.005845"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.632991" elapsed="0.005889"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:29.639837" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.639410" elapsed="0.000493"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:29.639954" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:29.640107" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:29.639089" elapsed="0.001042"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.640282" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.640996" level="INFO">index=68
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:29.640887" 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-04-25T23:55:29.641266" elapsed="0.002267"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.643976" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:29.644952" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.643711" elapsed="0.001613">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.655849" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:55:29.656231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.654437" 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-04-25T23:55:29.656753" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.657027" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:29.646280" elapsed="0.010889"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:29.645595" elapsed="0.011623"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.629832" elapsed="0.027468">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.657631" elapsed="0.000316"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.657999" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.614619" elapsed="0.043486">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:29.658210" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:29.658254" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.609864" elapsed="0.048412"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.658604" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.658352" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.658334" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:29.609721" elapsed="0.049001"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:29.609529" elapsed="0.049224"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:29.607173" elapsed="0.051635"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:29.602088" elapsed="0.056776"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.601589" elapsed="0.057318"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:29.598598" elapsed="0.060360"/>
</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-04-25T23:55:29.680047" elapsed="0.000422"/>
</kw>
<msg time="2026-04-25T23:55:29.680519" 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-04-25T23:55:29.679687" elapsed="0.000881"/>
</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-04-25T23:55:29.679287" elapsed="0.001355"/>
</kw>
<msg time="2026-04-25T23:55:29.680702" 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-04-25T23:55:29.670744" elapsed="0.010004"/>
</kw>
<msg time="2026-04-25T23:55:29.680852" 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-04-25T23:55:29.670406" elapsed="0.010470"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.681777" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:55:29.681042" elapsed="0.000762"/>
</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-04-25T23:55:29.682220" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.681903" elapsed="0.000383"/>
</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-04-25T23:55:29.713993" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.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-04-25T23:55:29.713570" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:29.714759" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.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-04-25T23:55:29.714512" elapsed="0.000312">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:29.714917" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:29.714181" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.715482" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:29.715101" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:29.715822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:29.715988" 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-04-25T23:55:29.715682" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.716414" 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-04-25T23:55:29.716169" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.717422" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.717164" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.717910" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.717621" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.718881" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:55:29.718346" elapsed="0.000561"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.720043" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.719527" elapsed="0.000555"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.720194" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:29.720419" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:55:29.719094" elapsed="0.001351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.720597" elapsed="0.000497"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:55:29.718210" elapsed="0.002926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.721910" 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-04-25T23:55:29.721380" elapsed="0.000556"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.723196" 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-04-25T23:55:29.722718" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.723350" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:29.723574" 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-04-25T23:55:29.722120" elapsed="0.001480"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.723777" elapsed="0.000469"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:29.721250" elapsed="0.003038"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.725047" 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-04-25T23:55:29.724531" elapsed="0.000541"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.726207" 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-04-25T23:55:29.725704" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.726357" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:29.726579" 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-04-25T23:55:29.725254" elapsed="0.001351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.726770" elapsed="0.000470"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:55:29.724401" elapsed="0.002882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.728090" 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-04-25T23:55:29.727525" elapsed="0.000591"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.729223" 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-04-25T23:55:29.728747" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.729375" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:55:29.729600" 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-04-25T23:55:29.728298" 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-04-25T23:55:29.729790" elapsed="0.000484"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:55:29.727395" elapsed="0.002922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.731075" 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-04-25T23:55:29.730560" elapsed="0.000540"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.732291" 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-04-25T23:55:29.731817" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.732444" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:29.732681" 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-04-25T23:55:29.731283" elapsed="0.001424"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.732857" elapsed="0.000473"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:55:29.730429" elapsed="0.002943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.734201" 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-04-25T23:55:29.733675" elapsed="0.000552"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.735340" 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-04-25T23:55:29.734861" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.735494" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:55:29.735804" 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-04-25T23:55:29.734410" elapsed="0.001420"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.735981" elapsed="0.000475"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:55:29.733529" elapsed="0.002970"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.737259" 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-04-25T23:55:29.736759" elapsed="0.000527"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.738429" 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-04-25T23:55:29.737943" elapsed="0.000527"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.738624" elapsed="0.000046"/>
</return>
<msg time="2026-04-25T23:55:29.738871" 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-04-25T23:55:29.737468" elapsed="0.001428"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.739046" elapsed="0.000476"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:55:29.736612" elapsed="0.002953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.740597" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:55:29.739911" elapsed="0.000712"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:55:29.741754" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.741265" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:55:29.741935" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:55:29.742161" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:55:29.740829" elapsed="0.001356"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.742334" elapsed="0.000493"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:55:29.739778" elapsed="0.003091"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:55:29.718024" elapsed="0.024879"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:55:29.742946" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:29.743106" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:55:29.716842" elapsed="0.026290"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.716524" elapsed="0.026639"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.743335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.743188" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.716505" elapsed="0.026905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.744470" level="INFO">${final_text} = /restconf/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-04-25T23:55:29.743550" elapsed="0.000948"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:29.744547" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:29.712961" elapsed="0.031724"/>
</kw>
<msg time="2026-04-25T23:55:29.744740" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.700427" elapsed="0.044361"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.762709" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.775018" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.787322" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.787518" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.787726" elapsed="0.000027"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.788119" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.787969" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.787954" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.788336" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.788508" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.788688" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:29.787926" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.787818" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.788914" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.788988" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:55:29.789107" level="INFO">${uri} = /restconf/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-04-25T23:55:29.696198" elapsed="0.092935"/>
</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-04-25T23:55:29.815425" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.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-04-25T23:55:29.815039" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:29.816176" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.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-04-25T23:55:29.815965" elapsed="0.000275">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:29.816332" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:29.815617" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.816966" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/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-04-25T23:55:29.816554" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:55:29.817290" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:55:29.817420" 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-04-25T23:55:29.817153" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.817891" 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-04-25T23:55:29.817604" 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-04-25T23:55:29.818310" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.818012" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.818854" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:29.818537" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.818393" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.817993" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.819998" 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.48&lt;/host&gt;
    &lt;p...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:55:29.819083" elapsed="0.000946"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:55:29.820079" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:55:29.814409" elapsed="0.005803"/>
</kw>
<msg time="2026-04-25T23:55:29.820268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.801798" elapsed="0.018518"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.832704" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.845031" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.857401" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.857647" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.857864" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.858240" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.858096" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.858080" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.858457" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.858623" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.858804" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:55:29.858052" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.857941" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.859027" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.859101" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:55:29.859224" 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.48&lt;/host&gt;
    &lt;p...</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-04-25T23:55:29.799153" elapsed="0.060099"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:55:29.860520" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.860263" elapsed="0.000323">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/full-uri-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:55:29.860697" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:55:29.859923" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.861043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.860800" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.861578" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:29.861288" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.861123" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.860781" elapsed="0.000894"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.864004" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:29.861839" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:55:29.864081" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:29.864239" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/full-uri-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:55:29.859584" elapsed="0.004680"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.865722" level="INFO">/restconf/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-04-25T23:55:29.865394" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.866196" 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.48&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-04-25T23:55:29.865955" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.866738" 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-04-25T23:55:29.866472" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.867172" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.866931" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:29.868174" 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-04-25T23:55:29.867829" elapsed="0.000371"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:55:29.868522" 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-04-25T23:55:29.868350" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.868710" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.869308" 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-04-25T23:55:29.869062" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:55:29.869393" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:29.869549" 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-04-25T23:55:29.867413" elapsed="0.002160"/>
</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-04-25T23:55:29.874981" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.872041" elapsed="0.004670">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.869644" elapsed="0.007158">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.876990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.876837" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.869626" elapsed="0.007454">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.877454" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.877584" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.877547" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.877530" 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-04-25T23:55:29.877854" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.877931" 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-04-25T23:55:29.864592" elapsed="0.013445">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.878113" 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-04-25T23:55:29.685348" elapsed="0.192861">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.878536" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.878357" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.878338" elapsed="0.000290"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.878676" elapsed="0.000016"/>
</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="FAIL" start="2026-04-25T23:55:29.682542" elapsed="0.196236">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.682310" elapsed="0.196538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.681884" elapsed="0.196994">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:55:29.879032" elapsed="0.000022"/>
</kw>
<arg>${device_name}</arg>
<arg>device_type=${device_type}</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.659271" elapsed="0.219874">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure the device again.
This is the second step of the device configuration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:55:29.597990" elapsed="0.281312">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t14" name="Wait_For_Device_To_Reconnect" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:29.883265" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:29.882998" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.884532" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.884420" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.884401" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.889635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.889528" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.889510" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.890745" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:29.890346" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.891221" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:29.890928" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:29.891290" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:29.891444" 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-04-25T23:55:29.889969" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.897037" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.896929" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.896910" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.898359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.898249" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.898231" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:29.898949" level="INFO">${karaf_connection_index} = 68</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.898570" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.899427" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.899168" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.900309" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.900033" elapsed="0.001163">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:29.901376" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:29.901422" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.899612" elapsed="0.001833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.902353" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.902071" elapsed="0.001317">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:29.903567" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:29.903612" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.901613" elapsed="0.002022"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.904745" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.903951" elapsed="0.000884">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.903729" elapsed="0.001220">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.903709" elapsed="0.001290">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.905193" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.905458" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.905291" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.905271" elapsed="0.000294"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.905603" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.908754" elapsed="0.000155"/>
</kw>
<msg time="2026-04-25T23:55:29.908980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.908015" elapsed="0.001060"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.910187" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.911220" 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-04-25T23:55:29.906524" elapsed="0.004813"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:29.905930" elapsed="0.005523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.897943" elapsed="0.013596">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</status>
</kw>
<msg time="2026-04-25T23:55:29.911643" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:29.911705" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Wait_For_Device_To_Reconnect"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.897252" elapsed="0.014477"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.911921" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.911812" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.911792" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.912802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.912695" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.912675" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.913143" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:29.913287" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:29.913018" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.913762" level="INFO">{1: 68}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.913465" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.914236" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.913986" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.914894" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:55:29.915318" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:29.915365" level="INFO">${old_connection_index} = 68</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.914435" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.916210" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.918345" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.917924" elapsed="0.001095">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.916621" elapsed="0.002476"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:29.920576" elapsed="0.000377"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.919337" elapsed="0.001679"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:29.915702" elapsed="0.005416"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.915465" elapsed="0.005705"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.915446" elapsed="0.005749"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:29.922193" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.921772" elapsed="0.000448"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:29.922269" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:55:29.922424" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:29.921399" elapsed="0.001049"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.922602" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.923508" level="INFO">index=69
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:29.923234" elapsed="0.000403"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:29.923833" elapsed="0.002287"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:29.926554" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:29.927641" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.926286" elapsed="0.001745">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:29.938335" elapsed="0.000366"/>
</kw>
<msg time="2026-04-25T23:55:29.938763" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:29.936954" elapsed="0.002069"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.939374" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.939634" elapsed="0.000039"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:29.928833" elapsed="0.010969"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:29.928306" elapsed="0.011580"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.912384" elapsed="0.027588">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.940308" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.940383" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.896579" elapsed="0.043909">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:29.940595" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:29.940640" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.891845" elapsed="0.048835"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.941018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.940767" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.940748" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:29.891705" elapsed="0.049413"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:29.891519" elapsed="0.049630"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:29.889165" elapsed="0.052037"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:29.884127" elapsed="0.057131"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:29.883700" elapsed="0.057603"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:29.880468" elapsed="0.060888"/>
</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-04-25T23:55:29.955747" 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-04-25T23:55:29.951562" elapsed="0.004218"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.956559" 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-04-25T23:55:29.956184" elapsed="0.000404"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:29.955999" elapsed="0.000639"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.957308" 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-04-25T23:55:29.956940" elapsed="0.000405"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:29.956760" elapsed="0.000628"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:29.955844" elapsed="0.001575"/>
</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-04-25T23:55:29.957834" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.957493" elapsed="0.000410"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.958777" level="INFO">${uri} = /restconf/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-04-25T23:55:29.958200" elapsed="0.000609"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:29.957929" elapsed="0.000919"/>
</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-04-25T23:55:29.959080" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.958876" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:29.957472" elapsed="0.001693"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:29.959205" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:55:29.959389" level="INFO">${uri} = /restconf/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-04-25T23:55:29.951113" elapsed="0.008304"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:29.959470" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:29.959719" level="INFO">${uri} = /restconf/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-04-25T23:55:29.950535" elapsed="0.009213"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.967403" level="INFO">/restconf/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-04-25T23:55:29.967145" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:29.967864" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:29.967601" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:29.972745" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.970039" elapsed="0.004356">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:29.967975" elapsed="0.006504">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.974680" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:29.974512" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:29.967956" elapsed="0.006819">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.975143" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.975273" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:29.975237" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:29.975220" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:29.975471" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.975539" 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-04-25T23:55:29.962722" elapsed="0.012921">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:29.975730" 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-04-25T23:55:29.960030" elapsed="0.015796">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.975994" 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-04-25T23:55:29.942558" elapsed="0.033543">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:30.993859" 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-04-25T23:55:30.990897" elapsed="0.003031"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:30.994606" 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-04-25T23:55:30.994279" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:30.994127" elapsed="0.000557"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:30.995239" 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-04-25T23:55:30.994920" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:30.994764" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:30.993990" elapsed="0.001340"/>
</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-04-25T23:55:30.995637" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:30.995394" 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-04-25T23:55:30.996432" level="INFO">${uri} = /restconf/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-04-25T23:55:30.995965" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:30.995734" 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-04-25T23:55:30.996698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:30.996521" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:30.995376" elapsed="0.001400"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:30.996810" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:30.996961" level="INFO">${uri} = /restconf/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-04-25T23:55:30.990237" elapsed="0.006749"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:30.997033" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:55:30.997174" level="INFO">${uri} = /restconf/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-04-25T23:55:30.989427" elapsed="0.007772"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:31.004507" level="INFO">/restconf/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-04-25T23:55:31.004257" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:31.004964" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:31.004721" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:31.009609" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:31.007145" elapsed="0.004084">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:31.005073" elapsed="0.006239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:31.011497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:31.011345" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:31.005055" elapsed="0.006529">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:31.011977" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:31.012143" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:31.012071" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:31.012055" 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-04-25T23:55:31.012349" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:31.012419" 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-04-25T23:55:30.999897" elapsed="0.012625">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:31.012593" 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-04-25T23:55:30.997434" elapsed="0.015272">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:31.012876" 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-04-25T23:55:30.976788" elapsed="0.036196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:32.031794" 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-04-25T23:55:32.028868" elapsed="0.002969"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:32.032784" 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-04-25T23:55:32.032307" elapsed="0.000515"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:32.032093" elapsed="0.000779"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:32.033688" 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-04-25T23:55:32.033220" elapsed="0.000505"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:32.032980" elapsed="0.000794"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:32.031912" elapsed="0.001903"/>
</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-04-25T23:55:32.034119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:32.033880" 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-04-25T23:55:32.034910" level="INFO">${uri} = /restconf/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-04-25T23:55:32.034426" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:32.034199" 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-04-25T23:55:32.035157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:32.034998" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:32.033861" elapsed="0.001371"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:32.035264" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:32.035413" level="INFO">${uri} = /restconf/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-04-25T23:55:32.028215" elapsed="0.007223"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:32.035483" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:32.035625" level="INFO">${uri} = /restconf/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-04-25T23:55:32.027418" elapsed="0.008231"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:32.042921" level="INFO">/restconf/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-04-25T23:55:32.042669" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:32.043408" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:32.043164" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:32.048025" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:32.045596" elapsed="0.004053">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:32.043518" elapsed="0.006235">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:32.049938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:32.049787" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:32.043499" elapsed="0.006526">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:32.050392" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:32.050522" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:32.050485" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:32.050469" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:32.050738" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:32.050809" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:32.038339" elapsed="0.012574">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:32.050983" 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-04-25T23:55:32.035886" elapsed="0.015191">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:32.051242" 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-04-25T23:55:32.013581" elapsed="0.037769">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:33.068468" 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-04-25T23:55:33.066345" elapsed="0.002152"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:33.069202" 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-04-25T23:55:33.068861" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:33.068706" elapsed="0.000560"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:33.069832" 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-04-25T23:55:33.069497" elapsed="0.000361"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:33.069346" elapsed="0.000592"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:33.068556" 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-04-25T23:55:33.070287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:33.070036" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:33.071094" level="INFO">${uri} = /restconf/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-04-25T23:55:33.070599" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:33.070369" 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-04-25T23:55:33.071347" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:33.071183" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:33.070017" elapsed="0.001406"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:33.071458" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:33.071613" level="INFO">${uri} = /restconf/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-04-25T23:55:33.065888" elapsed="0.005750"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:33.071700" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:33.071846" level="INFO">${uri} = /restconf/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-04-25T23:55:33.065299" elapsed="0.006573"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:33.079448" level="INFO">/restconf/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-04-25T23:55:33.079198" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:33.079905" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:33.079645" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:33.084739" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:33.082059" elapsed="0.004319">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:33.080014" elapsed="0.006447">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:33.086645" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:33.086495" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:33.079995" elapsed="0.006757">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:33.087121" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:33.087250" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:33.087214" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:33.087197" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:33.087449" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:33.087518" 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-04-25T23:55:33.074772" elapsed="0.012849">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:33.087745" 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-04-25T23:55:33.072094" elapsed="0.015750">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:33.088012" 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-04-25T23:55:33.051965" elapsed="0.036156">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:34.105358" 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-04-25T23:55:34.103113" elapsed="0.002280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:34.106133" 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-04-25T23:55:34.105800" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:34.105624" elapsed="0.000573"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:34.106767" 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-04-25T23:55:34.106429" elapsed="0.000364"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:34.106279" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:34.105469" elapsed="0.001388"/>
</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-04-25T23:55:34.107199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:34.106933" 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-04-25T23:55:34.107995" level="INFO">${uri} = /restconf/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-04-25T23:55:34.107511" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:34.107281" 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-04-25T23:55:34.108248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:34.108085" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:34.106911" elapsed="0.001414"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:34.108365" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:55:34.108534" level="INFO">${uri} = /restconf/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-04-25T23:55:34.102604" elapsed="0.005956"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:34.108607" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:55:34.108772" level="INFO">${uri} = /restconf/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-04-25T23:55:34.102008" elapsed="0.006790"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:34.116110" level="INFO">/restconf/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-04-25T23:55:34.115848" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:34.116552" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:34.116306" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:34.121525" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:34.118747" elapsed="0.004589">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:34.116677" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:34.123616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:34.123465" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:34.116643" elapsed="0.007081">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:34.124095" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:34.124225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:34.124189" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:34.124172" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:34.124426" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:34.124495" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:34.111521" elapsed="0.013085">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:34.124693" 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-04-25T23:55:34.109033" elapsed="0.015758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:34.124959" 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-04-25T23:55:34.089875" elapsed="0.035192">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:35.141884" 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-04-25T23:55:35.139732" elapsed="0.002187"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:35.142615" 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-04-25T23:55:35.142286" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:35.142131" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:35.143244" 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-04-25T23:55:35.142923" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:35.142774" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:35.141989" 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-04-25T23:55:35.143683" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:35.143406" 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-04-25T23:55:35.144539" level="INFO">${uri} = /restconf/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-04-25T23:55:35.143995" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:35.143765" elapsed="0.000840"/>
</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-04-25T23:55:35.144810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:35.144631" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:35.143386" elapsed="0.001502"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:35.144924" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:35.145086" level="INFO">${uri} = /restconf/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-04-25T23:55:35.139231" elapsed="0.005882"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:35.145160" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:35.145304" level="INFO">${uri} = /restconf/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-04-25T23:55:35.138628" elapsed="0.006702"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:35.153466" level="INFO">/restconf/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-04-25T23:55:35.153148" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:35.154049" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:35.153753" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:35.159880" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:35.156641" elapsed="0.005099">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:35.154181" elapsed="0.007665">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:35.162097" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:35.161892" elapsed="0.000275"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:35.154160" elapsed="0.008032">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:35.162593" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:35.162757" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:35.162715" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:35.162696" 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-04-25T23:55:35.162966" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:35.163036" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:35.148036" elapsed="0.015108">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:35.163216" 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-04-25T23:55:35.145554" elapsed="0.017758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:35.163533" 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-04-25T23:55:35.126281" elapsed="0.037380">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:36.181542" 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-04-25T23:55:36.179372" elapsed="0.002202"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:36.182324" 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-04-25T23:55:36.181960" elapsed="0.000392"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:36.181802" elapsed="0.000588"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:36.182967" 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-04-25T23:55:36.182625" elapsed="0.000370"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:36.182472" elapsed="0.000561"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:36.181641" elapsed="0.001421"/>
</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-04-25T23:55:36.183396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:36.183133" 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-04-25T23:55:36.184219" level="INFO">${uri} = /restconf/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-04-25T23:55:36.183725" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:36.183479" 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-04-25T23:55:36.184475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:36.184310" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:36.183114" elapsed="0.001438"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:36.184589" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:36.184775" level="INFO">${uri} = /restconf/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-04-25T23:55:36.178891" elapsed="0.005911"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:36.184849" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:36.184997" level="INFO">${uri} = /restconf/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-04-25T23:55:36.178295" elapsed="0.006730"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:36.192430" level="INFO">/restconf/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-04-25T23:55:36.192164" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:36.192893" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:36.192632" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:36.197685" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:36.195153" elapsed="0.004243">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:36.193004" elapsed="0.006476">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:36.199738" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:36.199568" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:36.192985" elapsed="0.006844">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:36.200204" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:36.200337" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:36.200300" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:36.200282" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:36.200540" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:36.200611" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:36.187758" elapsed="0.012975">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:36.200805" 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-04-25T23:55:36.185248" elapsed="0.015653">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:36.201095" 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-04-25T23:55:36.164473" elapsed="0.036733">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:37.218393" 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-04-25T23:55:37.216239" elapsed="0.002187"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:37.219148" 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-04-25T23:55:37.218816" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:37.218634" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:37.219781" 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-04-25T23:55:37.219442" elapsed="0.000366"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:37.219292" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:37.218493" 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-04-25T23:55:37.220208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:37.219943" 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-04-25T23:55:37.221043" level="INFO">${uri} = /restconf/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-04-25T23:55:37.220521" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:37.220291" elapsed="0.000816"/>
</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-04-25T23:55:37.221295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:37.221132" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:37.219923" elapsed="0.001450"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:37.221408" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:37.221632" level="INFO">${uri} = /restconf/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-04-25T23:55:37.215761" elapsed="0.005913"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:37.221724" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:37.221869" level="INFO">${uri} = /restconf/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-04-25T23:55:37.215149" 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-04-25T23:55:37.229189" level="INFO">/restconf/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-04-25T23:55:37.228931" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:37.229632" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:37.229385" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:37.234914" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:37.231955" elapsed="0.004660">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:37.229760" elapsed="0.006968">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:37.236918" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:37.236765" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:37.229741" elapsed="0.007271">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:37.237390" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:37.237523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:37.237486" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:37.237469" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:37.237743" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:37.237813" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:37.224591" elapsed="0.013328">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:37.238012" 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-04-25T23:55:37.222119" elapsed="0.015996">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:37.238287" 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-04-25T23:55:37.202892" elapsed="0.035505">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:38.256231" 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-04-25T23:55:38.253299" elapsed="0.002964"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:38.256969" 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-04-25T23:55:38.256623" elapsed="0.000373"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:38.256471" elapsed="0.000562"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:38.257582" 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-04-25T23:55:38.257262" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:38.257113" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:38.256331" elapsed="0.001361"/>
</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-04-25T23:55:38.258033" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:38.257763" 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-04-25T23:55:38.258861" level="INFO">${uri} = /restconf/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-04-25T23:55:38.258366" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:38.258134" 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-04-25T23:55:38.259126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:38.258963" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:38.257744" elapsed="0.001458"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:38.259239" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:38.259412" level="INFO">${uri} = /restconf/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-04-25T23:55:38.252616" elapsed="0.006823"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:38.259485" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:38.259630" level="INFO">${uri} = /restconf/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-04-25T23:55:38.251817" elapsed="0.007853"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:38.267197" level="INFO">/restconf/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-04-25T23:55:38.266937" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:38.267684" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:38.267410" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:38.272474" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:38.269849" elapsed="0.004332">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:38.267798" elapsed="0.006467">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:38.274450" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:38.274299" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:38.267779" elapsed="0.006759">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:38.274919" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:38.275108" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:38.275071" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:38.275053" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:38.275331" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:38.275404" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:38.262574" elapsed="0.012938">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:38.275586" 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-04-25T23:55:38.259896" elapsed="0.015806">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:38.275874" 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-04-25T23:55:38.239355" elapsed="0.036632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:39.294063" 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-04-25T23:55:39.291714" elapsed="0.002384"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:39.294816" 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-04-25T23:55:39.294471" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:39.294317" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:39.295434" 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-04-25T23:55:39.295111" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:39.294960" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:39.294168" 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-04-25T23:55:39.295916" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:39.295611" 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-04-25T23:55:39.296723" level="INFO">${uri} = /restconf/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-04-25T23:55:39.296231" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:39.296000" 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-04-25T23:55:39.296975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:39.296812" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:39.295589" elapsed="0.001464"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:39.297089" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:39.297249" level="INFO">${uri} = /restconf/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-04-25T23:55:39.291219" elapsed="0.006056"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:39.297322" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:39.297467" level="INFO">${uri} = /restconf/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-04-25T23:55:39.290627" elapsed="0.006865"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:39.305013" level="INFO">/restconf/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-04-25T23:55:39.304753" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:39.305454" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:39.305211" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:39.310277" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:39.307718" elapsed="0.004300">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:39.305563" elapsed="0.006554">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:39.312303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:39.312152" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:39.305544" elapsed="0.006847">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:39.312777" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:39.312910" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:39.312873" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:39.312856" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:39.313112" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:39.313182" 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-04-25T23:55:39.300292" elapsed="0.012994">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:39.313358" 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-04-25T23:55:39.297731" elapsed="0.015721">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:39.313619" 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-04-25T23:55:39.276813" elapsed="0.036932">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:40.333719" 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-04-25T23:55:40.331547" elapsed="0.002207"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:40.334459" 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-04-25T23:55:40.334128" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:40.333969" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:40.335153" 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-04-25T23:55:40.334831" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:40.334679" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:40.333826" elapsed="0.001419"/>
</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-04-25T23:55:40.335575" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:40.335314" 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-04-25T23:55:40.336397" level="INFO">${uri} = /restconf/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-04-25T23:55:40.335904" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:40.335671" 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-04-25T23:55:40.336663" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:40.336488" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:40.335294" elapsed="0.001449"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:40.336779" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:40.336939" level="INFO">${uri} = /restconf/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-04-25T23:55:40.331074" elapsed="0.005891"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:40.337013" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:40.337157" level="INFO">${uri} = /restconf/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-04-25T23:55:40.330476" elapsed="0.006707"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:40.344472" level="INFO">/restconf/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-04-25T23:55:40.344194" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:40.344930" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:40.344685" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:40.349711" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:40.347079" elapsed="0.004324">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:40.345040" elapsed="0.006447">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:40.351687" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:40.351521" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:40.345022" elapsed="0.006754">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:40.352149" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:40.352281" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:40.352244" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:40.352227" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:40.352507" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:40.352577" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:40.339873" elapsed="0.012857">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:40.352805" 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-04-25T23:55:40.337408" elapsed="0.015493">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:40.353071" 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-04-25T23:55:40.314573" elapsed="0.038608">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:41.370705" 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-04-25T23:55:41.368562" elapsed="0.002177"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:41.371427" 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-04-25T23:55:41.371098" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:41.370943" elapsed="0.000547"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:41.372057" 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-04-25T23:55:41.371736" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:41.371570" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:41.370804" 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-04-25T23:55:41.372475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:41.372217" 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-04-25T23:55:41.373295" level="INFO">${uri} = /restconf/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-04-25T23:55:41.372800" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:41.372557" 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-04-25T23:55:41.373548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:41.373385" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:41.372198" elapsed="0.001426"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:41.373675" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:41.373836" level="INFO">${uri} = /restconf/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-04-25T23:55:41.368087" elapsed="0.005775"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:41.373910" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:41.374055" level="INFO">${uri} = /restconf/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-04-25T23:55:41.367495" 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-04-25T23:55:41.381376" level="INFO">/restconf/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-04-25T23:55:41.381119" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:41.381838" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:41.381577" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:41.386569" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:41.384034" elapsed="0.004298">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:41.381951" elapsed="0.006466">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:41.388605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:41.388452" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:41.381933" elapsed="0.006779">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:41.389134" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:41.389279" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:41.389237" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:41.389220" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:41.389485" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:41.389555" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:41.376776" elapsed="0.012901">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:41.389750" 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-04-25T23:55:41.374307" elapsed="0.015541">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:41.390019" 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-04-25T23:55:41.353941" elapsed="0.036194">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:42.406053" 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-04-25T23:55:42.403928" elapsed="0.002156"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:42.406791" 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-04-25T23:55:42.406445" elapsed="0.000374"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:42.406291" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:42.407406" 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-04-25T23:55:42.407086" elapsed="0.000347"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:42.406935" elapsed="0.000533"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:42.406151" 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-04-25T23:55:42.407841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:42.407565" 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-04-25T23:55:42.408727" level="INFO">${uri} = /restconf/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-04-25T23:55:42.408155" elapsed="0.000601"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:42.407923" elapsed="0.000870"/>
</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-04-25T23:55:42.408987" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:42.408819" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:42.407546" elapsed="0.001518"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:42.409099" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:55:42.409258" level="INFO">${uri} = /restconf/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-04-25T23:55:42.403438" elapsed="0.005846"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:42.409331" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:42.409487" level="INFO">${uri} = /restconf/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-04-25T23:55:42.402865" elapsed="0.006651"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:42.416895" level="INFO">/restconf/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-04-25T23:55:42.416624" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:42.417338" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:42.417093" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:42.422084" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:42.419608" elapsed="0.004155">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:42.417473" elapsed="0.006375">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:42.424034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:42.423883" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:42.417452" elapsed="0.006669">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:42.424497" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:42.424629" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:42.424592" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:42.424575" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:42.424849" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:42.424918" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:42.412203" elapsed="0.012819">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:42.425094" 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-04-25T23:55:42.409755" elapsed="0.015438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:42.425398" 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-04-25T23:55:42.390893" elapsed="0.034630">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:43.442200" 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-04-25T23:55:43.440047" elapsed="0.002186"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:43.442942" 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-04-25T23:55:43.442597" elapsed="0.000372"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:43.442440" elapsed="0.000565"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:43.443567" 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-04-25T23:55:43.443244" elapsed="0.000350"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:43.443087" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:43.442298" 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-04-25T23:55:43.444011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:43.443747" 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-04-25T23:55:43.444810" level="INFO">${uri} = /restconf/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-04-25T23:55:43.444323" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:43.444093" 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-04-25T23:55:43.445063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:43.444901" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:43.443727" elapsed="0.001413"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:43.445176" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:43.445335" level="INFO">${uri} = /restconf/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-04-25T23:55:43.439557" elapsed="0.005805"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:43.445409" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:43.445552" level="INFO">${uri} = /restconf/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-04-25T23:55:43.438985" elapsed="0.006593"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:43.452878" level="INFO">/restconf/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-04-25T23:55:43.452602" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:43.453323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:43.453078" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:43.458532" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:43.455524" elapsed="0.004711">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:43.453434" elapsed="0.006884">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:43.460589" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:43.460433" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:43.453415" elapsed="0.007281">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:43.461076" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:43.461210" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:43.461172" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:43.461155" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:43.461416" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:43.461486" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:43.448292" elapsed="0.013299">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:43.461679" 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-04-25T23:55:43.445816" elapsed="0.015961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:43.461946" 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-04-25T23:55:43.426317" elapsed="0.035767">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:44.478722" 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-04-25T23:55:44.476550" elapsed="0.002205"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:44.479445" 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-04-25T23:55:44.479116" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:44.478961" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:44.480072" 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-04-25T23:55:44.479753" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:44.479588" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:44.478820" elapsed="0.001344"/>
</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-04-25T23:55:44.480496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:44.480231" 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-04-25T23:55:44.481296" level="INFO">${uri} = /restconf/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-04-25T23:55:44.480823" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:44.480577" 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-04-25T23:55:44.481548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:44.481386" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:44.480212" elapsed="0.001412"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:44.481673" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:44.481900" level="INFO">${uri} = /restconf/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-04-25T23:55:44.476076" elapsed="0.005850"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:44.481975" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:44.482120" level="INFO">${uri} = /restconf/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-04-25T23:55:44.475485" elapsed="0.006661"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:44.489440" level="INFO">/restconf/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-04-25T23:55:44.489177" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:44.489898" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:44.489639" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:44.494783" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:44.492085" elapsed="0.004388">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:44.490009" elapsed="0.006547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:44.496760" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:44.496592" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:44.489990" elapsed="0.006859">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:44.497221" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:44.497354" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:44.497317" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:44.497300" 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-04-25T23:55:44.497571" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:44.497640" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:44.484857" elapsed="0.012905">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:44.497833" 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-04-25T23:55:44.482369" elapsed="0.015558">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:44.498095" 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-04-25T23:55:44.462927" elapsed="0.035278">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:45.515801" 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-04-25T23:55:45.513614" elapsed="0.002219"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:45.516969" 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-04-25T23:55:45.516201" elapsed="0.000830"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:45.516041" elapsed="0.001070"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:45.518385" 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-04-25T23:55:45.517630" elapsed="0.000817"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:45.517291" elapsed="0.001237"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:45.515901" elapsed="0.002694"/>
</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-04-25T23:55:45.519419" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:45.518776" elapsed="0.000784"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:45.520761" level="INFO">${uri} = /restconf/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-04-25T23:55:45.520231" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:45.519617" elapsed="0.001212"/>
</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-04-25T23:55:45.521026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:45.520857" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:45.518733" elapsed="0.002372"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:45.521143" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:55:45.521340" level="INFO">${uri} = /restconf/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-04-25T23:55:45.513140" elapsed="0.008234"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:45.521424" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:45.521575" level="INFO">${uri} = /restconf/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-04-25T23:55:45.512511" elapsed="0.009090"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:45.529063" level="INFO">/restconf/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-04-25T23:55:45.528800" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:45.529543" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:45.529282" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:45.534620" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:45.531817" elapsed="0.004603">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:45.529672" elapsed="0.006835">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:45.536717" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:45.536543" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:45.529636" elapsed="0.007173">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:45.537192" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:45.537415" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:45.537376" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:45.537357" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:45.537625" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:45.537713" 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-04-25T23:55:45.524375" elapsed="0.013448">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:45.537897" 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-04-25T23:55:45.521847" elapsed="0.016151">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:45.538170" 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-04-25T23:55:45.499143" elapsed="0.039142">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:46.558407" 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-04-25T23:55:46.555427" elapsed="0.003023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:46.559426" 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-04-25T23:55:46.558965" elapsed="0.000499"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:46.558749" elapsed="0.000765"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:46.560313" 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-04-25T23:55:46.559891" elapsed="0.000449"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:46.559677" elapsed="0.000699"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:46.558537" elapsed="0.001869"/>
</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-04-25T23:55:46.560746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:46.560475" 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-04-25T23:55:46.561530" level="INFO">${uri} = /restconf/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-04-25T23:55:46.561058" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:46.560829" 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-04-25T23:55:46.561799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:46.561620" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:46.560456" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:46.561912" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:46.562073" level="INFO">${uri} = /restconf/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-04-25T23:55:46.554770" elapsed="0.007330"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:46.562147" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:55:46.562293" level="INFO">${uri} = /restconf/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-04-25T23:55:46.553946" elapsed="0.008373"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:46.569735" level="INFO">/restconf/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-04-25T23:55:46.569461" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:46.570177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:46.569934" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:46.575043" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:46.572351" elapsed="0.004459">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:46.570293" elapsed="0.006602">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:46.577082" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:46.576930" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:46.570274" elapsed="0.006896">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:46.577549" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:46.577700" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:46.577644" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:46.577628" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:46.577906" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:46.577976" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:46.565103" elapsed="0.012980">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:46.578155" 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-04-25T23:55:46.562543" elapsed="0.015708">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:46.578421" 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-04-25T23:55:46.539092" elapsed="0.039438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:47.590493" 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-04-25T23:55:47.588359" elapsed="0.002166"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:47.591232" 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-04-25T23:55:47.590901" elapsed="0.000358"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:47.590743" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:47.591941" 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-04-25T23:55:47.591597" elapsed="0.000371"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:47.591443" elapsed="0.000561"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:47.590590" elapsed="0.001443"/>
</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-04-25T23:55:47.592372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:47.592103" 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-04-25T23:55:47.593173" level="INFO">${uri} = /restconf/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-04-25T23:55:47.592696" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:47.592452" 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-04-25T23:55:47.593427" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:47.593263" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:47.592084" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:47.593540" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:55:47.593715" level="INFO">${uri} = /restconf/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-04-25T23:55:47.587856" elapsed="0.005886"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:47.593791" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:47.593937" level="INFO">${uri} = /restconf/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-04-25T23:55:47.587267" elapsed="0.006696"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:47.601227" level="INFO">/restconf/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-04-25T23:55:47.600972" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:47.601683" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:47.601425" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:47.606678" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:47.603980" elapsed="0.004391">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:47.601795" elapsed="0.006660">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:47.608643" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:47.608489" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:47.601777" elapsed="0.006972">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:47.609119" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:47.609252" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:47.609213" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:47.609196" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:47.609458" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:47.609526" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:47.596677" elapsed="0.013006">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:47.609767" 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-04-25T23:55:47.594187" elapsed="0.015677">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:47.610035" 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-04-25T23:55:47.579565" elapsed="0.030580">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:48.628759" 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-04-25T23:55:48.626605" elapsed="0.002187"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:48.629485" 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-04-25T23:55:48.629156" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:48.628999" elapsed="0.000548"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:48.630116" 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-04-25T23:55:48.629795" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:48.629630" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:48.628859" elapsed="0.001350"/>
</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-04-25T23:55:48.630562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:48.630278" 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-04-25T23:55:48.631360" level="INFO">${uri} = /restconf/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-04-25T23:55:48.630890" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:48.630645" 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-04-25T23:55:48.631614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:48.631449" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:48.630258" elapsed="0.001448"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:48.631743" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:48.631902" level="INFO">${uri} = /restconf/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-04-25T23:55:48.626129" elapsed="0.005800"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:48.631976" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:55:48.632119" level="INFO">${uri} = /restconf/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-04-25T23:55:48.625538" elapsed="0.006608"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:48.639787" level="INFO">/restconf/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-04-25T23:55:48.639511" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:48.640235" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:48.639990" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:48.645220" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:48.642491" elapsed="0.004470">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:48.640348" elapsed="0.006697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:48.647233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:48.647081" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:48.640329" elapsed="0.006998">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:48.647717" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:48.647851" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:48.647814" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:48.647798" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:48.648054" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:48.648124" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:48.635077" elapsed="0.013153">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:48.648301" 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-04-25T23:55:48.632373" elapsed="0.016024">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:48.648566" 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-04-25T23:55:48.611254" elapsed="0.037461">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:49.665728" 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-04-25T23:55:49.663352" elapsed="0.002409"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:49.666459" 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-04-25T23:55:49.666126" elapsed="0.000360"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:49.665972" elapsed="0.000550"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:49.667092" 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-04-25T23:55:49.666768" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:49.666603" elapsed="0.000552"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:49.665828" 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-04-25T23:55:49.667530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:49.667256" 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-04-25T23:55:49.668426" level="INFO">${uri} = /restconf/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-04-25T23:55:49.667861" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:49.667612" elapsed="0.000879"/>
</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-04-25T23:55:49.668698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:49.668517" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:49.667235" elapsed="0.001541"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:49.668813" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:55:49.668972" level="INFO">${uri} = /restconf/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-04-25T23:55:49.662869" elapsed="0.006130"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:49.669046" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:49.669190" level="INFO">${uri} = /restconf/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-04-25T23:55:49.662228" elapsed="0.007010"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:49.676518" level="INFO">/restconf/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-04-25T23:55:49.676260" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:49.676977" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:49.676733" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:49.681762" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:49.679152" elapsed="0.004309">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:49.677087" elapsed="0.006458">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:49.683748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:49.683579" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:49.677069" elapsed="0.006767">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:49.684204" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:49.684336" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:49.684299" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:49.684282" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:49.684536" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:49.684605" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:49.671951" elapsed="0.012773">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:49.684797" 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-04-25T23:55:49.669469" elapsed="0.015423">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:49.685096" 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-04-25T23:55:49.649876" elapsed="0.035358">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:50.702867" 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-04-25T23:55:50.700037" elapsed="0.002862"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.703592" 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-04-25T23:55:50.703266" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:55:50.703111" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.704218" 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-04-25T23:55:50.703902" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:55:50.703752" elapsed="0.000528"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:55:50.702968" elapsed="0.001341"/>
</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-04-25T23:55:50.704638" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.704377" 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-04-25T23:55:50.705433" level="INFO">${uri} = /restconf/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-04-25T23:55:50.704965" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:50.704735" elapsed="0.000762"/>
</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-04-25T23:55:50.705701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.705522" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.704358" elapsed="0.001432"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:50.705827" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:55:50.705986" level="INFO">${uri} = /restconf/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-04-25T23:55:50.699354" elapsed="0.006658"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:55:50.706059" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:55:50.706202" level="INFO">${uri} = /restconf/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-04-25T23:55:50.698535" elapsed="0.007693"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.713464" level="INFO">/restconf/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-04-25T23:55:50.713208" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.713927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:50.713673" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:50.718837" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.716064" elapsed="0.004479">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:50.714035" elapsed="0.006593">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.720896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.720740" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:50.714017" elapsed="0.006967">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.721413" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.721546" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.721510" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:50.721493" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.721803" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.721875" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.708905" elapsed="0.013076">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.722052" 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-04-25T23:55:50.706454" elapsed="0.015693">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:50.722314" 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-04-25T23:55:50.686107" elapsed="0.036321">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:55:50.722542" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:55:29.942003" elapsed="20.780676">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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-04-25T23:55:29.941558" elapsed="20.781266">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:55:29.879846" elapsed="20.843161">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t15" name="Check_Modified_Device_Data_Is_Still_There" line="119">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:55:50.726792" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:55:50.726508" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.728233" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.728090" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.728072" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.734676" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.734460" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.734421" elapsed="0.000385"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.736453" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:55:50.735804" elapsed="0.000690"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.737181" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:55:50.736747" elapsed="0.000469"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:55:50.737278" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:55:50.737508" 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-04-25T23:55:50.735221" elapsed="0.002327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.747218" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.747108" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.747089" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.748546" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.748441" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.748423" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:50.749165" level="INFO">${karaf_connection_index} = 69</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:50.748799" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.749603" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:50.749349" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.750500" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.750202" elapsed="0.001262">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:50.751648" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:55:50.751710" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.749813" elapsed="0.001920"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.752571" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.752293" elapsed="0.001324">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:55:50.753839" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:55:50.753884" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.751900" elapsed="0.002007"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.754830" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.754201" elapsed="0.000707">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:50.753982" elapsed="0.001024">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:55:50.753963" elapsed="0.001078">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.755198" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.755422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.755283" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:50.755266" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.755553" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:50.758837" elapsed="0.000155"/>
</kw>
<msg time="2026-04-25T23:55:50.759071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:50.758055" elapsed="0.001111"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.760201" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.761176" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:50.756424" elapsed="0.004868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:50.755841" elapsed="0.005566"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.748140" elapsed="0.013355">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</status>
</kw>
<msg time="2026-04-25T23:55:50.761598" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:50.761641" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Modified_Device_Data_Is_Still_There"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.747439" elapsed="0.014309"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.761964" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.761854" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.761834" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.762990" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.762885" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.762868" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.763332" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:50.763435" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:55:50.763205" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.763888" level="INFO">{1: 69}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:50.763609" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.764322" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:50.764082" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:50.764902" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:55:50.765316" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:55:50.765362" level="INFO">${old_connection_index} = 69</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.764519" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:50.766378" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.768462" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.768045" elapsed="0.000972">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.766788" elapsed="0.002306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:55:50.770624" elapsed="0.000369"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.769327" elapsed="0.001728"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:55:50.765860" elapsed="0.005295"/>
</kw>
<status status="PASS" start="2026-04-25T23:55:50.765459" elapsed="0.005747"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.765441" elapsed="0.005790"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:55:50.772171" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:55:50.771767" elapsed="0.000431"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:55:50.772247" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:55:50.772432" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:55:50.771433" elapsed="0.001023"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:55:50.772609" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.773331" level="INFO">index=70
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:55:50.773223" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:55:50.773599" elapsed="0.002341"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:55:50.776366" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:55:50.777446" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.776103" elapsed="0.001778">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:55:50.788179" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:55:50.788561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:55:50.786756" elapsed="0.001894"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.789083" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.789347" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:55:50.778735" elapsed="0.010753"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:55:50.778153" elapsed="0.011384"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.762415" elapsed="0.027204">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.789977" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.790050" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.746765" elapsed="0.043389">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:55:50.790259" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:55:50.790302" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.738171" elapsed="0.052155"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.790650" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.790401" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-25T23:55:50.790383" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:55:50.737960" elapsed="0.052805"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:55:50.737635" elapsed="0.053163"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:55:50.733663" elapsed="0.057188"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:55:50.727671" elapsed="0.063234"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:55:50.727215" elapsed="0.063735"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:55:50.724221" elapsed="0.066781"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.793060" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:50.792679" 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-04-25T23:55:50.800397" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:50.800147" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:50.800857" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:50.800595" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:50.805546" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.803046" elapsed="0.004168">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:50.800967" elapsed="0.006329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.807480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.807331" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:50.800949" elapsed="0.006619">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.807968" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.808102" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:50.808065" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:50.808048" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.808304" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.808374" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.795754" elapsed="0.012725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.808551" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.793335" elapsed="0.015311">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:50.808719" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.792404" elapsed="0.016409">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.809036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.808888" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.809257" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.809115" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:50.809475" elapsed="0.000284"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:50.809335" elapsed="0.000485"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:50.808871" elapsed="0.000971"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:50.792018" elapsed="0.017909">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:51.813973" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:51.812788" elapsed="0.001268"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:51.824478" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:51.824209" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:51.824946" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:51.824695" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:51.830976" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:51.827299" elapsed="0.005599">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:51.825077" elapsed="0.007915">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:51.833186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:51.833033" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:51.825050" elapsed="0.008226">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:51.833701" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:51.833844" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:51.833802" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:51.833784" 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-04-25T23:55:51.834058" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:51.834128" 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-04-25T23:55:51.819849" elapsed="0.014391">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:51.834311" elapsed="0.000036"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:51.814623" elapsed="0.019808">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:51.834498" elapsed="0.000017"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:51.812060" elapsed="0.022537">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:51.834917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:51.834764" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:51.835141" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:51.834996" elapsed="0.000199"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:51.835356" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:51.835218" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:51.834745" elapsed="0.000685"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:51.810930" elapsed="0.024609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:52.839953" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:52.838188" elapsed="0.001839"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:52.851552" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:52.851288" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:52.852014" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:52.851766" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:52.857070" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:52.854231" elapsed="0.004563">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:52.852140" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:52.859085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:52.858932" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:52.852112" elapsed="0.007060">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:52.859552" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:52.859706" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:52.859649" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:52.859631" 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-04-25T23:55:52.859916" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:52.859985" 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-04-25T23:55:52.846143" elapsed="0.013951">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:52.860219" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:52.840557" elapsed="0.019762">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:52.860373" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:52.837518" elapsed="0.022947">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:52.860701" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:52.860538" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:52.860925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:52.860782" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:52.861141" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:52.861002" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:52.860522" elapsed="0.000692"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:52.836354" elapsed="0.024939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:53.865019" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:53.864021" 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-04-25T23:55:53.876998" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:53.876734" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:53.877454" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:53.877200" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:53.882546" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:53.879703" elapsed="0.004593">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:53.877604" elapsed="0.006780">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:53.884573" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:53.884423" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:53.877576" elapsed="0.007100">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:53.885053" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:53.885255" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:53.885211" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:53.885131" 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-04-25T23:55:53.885466" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:53.885538" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:53.870493" elapsed="0.015152">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:53.885733" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:53.865597" elapsed="0.020232">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:53.885884" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:53.863325" elapsed="0.022650">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:53.886195" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:53.886049" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:53.886411" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:53.886272" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:53.886622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:53.886486" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:53.886032" elapsed="0.000678"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:53.862212" elapsed="0.024576">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:54.890596" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:54.889521" elapsed="0.001223"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:54.902154" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:54.901785" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:54.902830" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:54.902458" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:54.908364" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:54.905564" elapsed="0.004544">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:54.903002" elapsed="0.007196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.910397" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:54.910237" elapsed="0.000301"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:54.902968" elapsed="0.007595">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.910965" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:54.911104" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:54.911064" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:54.911047" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.911316" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:54.911391" 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-04-25T23:55:54.895613" elapsed="0.015892">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:54.911578" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:54.891280" elapsed="0.020410">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:54.911748" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:54.888842" elapsed="0.022999">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.912102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:54.911949" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.912319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:54.912180" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:54.912542" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:54.912400" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:54.911899" elapsed="0.000718"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:54.887606" elapsed="0.025107">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:55.916407" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:55.915391" 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-04-25T23:55:55.929281" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:55.929015" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:55.929741" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:55.929480" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:55.935510" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:55.931953" elapsed="0.005385">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:55.929871" elapsed="0.007559">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.937630" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:55.937471" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:55.929842" elapsed="0.007897">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.938125" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:55.938261" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:55.938221" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:55.938205" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.938468" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:55.938550" 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-04-25T23:55:55.923363" elapsed="0.015331">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:55.938767" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:55.917064" elapsed="0.021797">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:55.938916" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:55.914736" elapsed="0.024269">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.939224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:55.939079" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.939438" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:55.939299" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:55.939644" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:55.939512" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:55.939062" elapsed="0.000671"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:55.913566" elapsed="0.026244">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:56.943718" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:56.942602" elapsed="0.001196"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:56.957965" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:56.957560" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:56.958608" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:56.958245" 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-04-25T23:55:56.964742" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:56.961738" elapsed="0.004761">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:56.958810" elapsed="0.007782">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.966806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:56.966633" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:56.958775" elapsed="0.008120">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.967290" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:56.967429" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:56.967388" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:56.967371" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.967638" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:56.967723" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:56.950538" elapsed="0.017294">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:56.967903" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:56.944326" elapsed="0.023669">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:56.968049" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:56.941914" elapsed="0.026238">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.968382" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:56.968228" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.968599" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:56.968459" elapsed="0.000207"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:56.968827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:56.968690" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:56.968211" elapsed="0.000690"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:56.940736" elapsed="0.028290">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:57.972600" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:57.971592" 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-04-25T23:55:57.983479" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:57.983218" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:57.983943" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:57.983694" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:57.989006" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:57.986141" elapsed="0.004582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:57.984063" elapsed="0.006748">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.991000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:57.990848" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:57.984041" elapsed="0.007048">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.991471" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:57.991604" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:57.991566" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:57.991549" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.991827" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:57.991896" 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-04-25T23:55:57.978895" elapsed="0.013106">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:57.992072" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:57.973231" elapsed="0.018935">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:57.992219" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:57.970952" elapsed="0.021357">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.992581" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:57.992433" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.992822" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:57.992681" elapsed="0.000195"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:57.993034" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:57.992899" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:57.992415" elapsed="0.000693"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:57.969869" elapsed="0.023316">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:55:58.996830" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:55:58.995837" 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-04-25T23:55:59.007565" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:59.007302" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:55:59.008023" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:55:59.007778" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:55:59.013268" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:55:59.010226" elapsed="0.004797">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:55:59.008147" elapsed="0.006973">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.015309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:59.015158" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:55:59.008122" elapsed="0.007275">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.015792" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:59.015926" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:55:59.015887" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:59.015870" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.016131" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:55:59.016198" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:55:59.001524" elapsed="0.014780">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:55:59.016374" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:55:58.997389" elapsed="0.019135">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:55:59.016580" elapsed="0.000017"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:55:58.995177" elapsed="0.021516">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.016918" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:59.016768" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.017140" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:59.017000" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:55:59.017350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:55:59.017215" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:55:59.016752" elapsed="0.000671"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:55:58.994073" elapsed="0.023427">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:00.021006" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:00.020044" 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-04-25T23:56:00.032366" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:00.032002" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:00.033016" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:00.032646" 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-04-25T23:56:00.038731" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:00.035981" elapsed="0.004434">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:00.033180" elapsed="0.007321">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.040706" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:00.040537" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:00.033150" elapsed="0.007645">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.041172" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:00.041305" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:00.041267" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:00.041250" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.041511" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:00.041636" 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-04-25T23:56:00.025951" elapsed="0.015814">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:00.041837" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:00.021561" elapsed="0.020372">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:00.041988" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:00.019388" elapsed="0.022692">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.042301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:00.042155" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.042520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:00.042380" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:00.042775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:00.042621" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:00.042139" elapsed="0.000710"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:00.018308" elapsed="0.024619">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:01.046277" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:01.045336" 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-04-25T23:56:01.058389" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:01.058127" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:01.058854" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:01.058589" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:01.063637" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:01.061050" elapsed="0.004303">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:01.058973" elapsed="0.006465">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.065623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:01.065473" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:01.058951" elapsed="0.006775">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.066157" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:01.066292" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:01.066254" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:01.066237" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.066499" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:01.066568" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:01.053064" elapsed="0.013628">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:01.066765" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:01.046855" elapsed="0.020015">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:01.066925" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:01.044724" elapsed="0.022293">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.067264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:01.067090" elapsed="0.000229"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.067480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:01.067342" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:01.067707" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:01.067557" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:01.067074" elapsed="0.000716"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:01.043720" elapsed="0.024147">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:02.071352" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:02.070388" 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-04-25T23:56:02.081986" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:02.081721" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:02.082435" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:02.082186" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:02.087737" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:02.084643" elapsed="0.004788">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:02.082554" elapsed="0.007016">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.089777" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:02.089608" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:02.082532" elapsed="0.007334">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.090239" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:02.090373" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:02.090334" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:02.090318" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.090578" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:02.090648" 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-04-25T23:56:02.075998" elapsed="0.014773">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:02.090843" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:02.071989" elapsed="0.018949">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:02.090993" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:02.069756" elapsed="0.021329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.091306" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:02.091159" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.091524" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:02.091384" elapsed="0.000198"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:02.091783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:02.091604" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:02.091143" elapsed="0.000717"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:02.068714" elapsed="0.023230">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:03.095268" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:03.094325" 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-04-25T23:56:03.106794" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:03.106513" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:03.107240" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:03.106995" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:03.113223" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:03.109758" elapsed="0.008992">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:03.107415" elapsed="0.011546">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:03.119377" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:03.119033" elapsed="0.000445"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:03.107393" elapsed="0.012120">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:03.120194" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:03.120407" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:03.120348" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:03.120320" 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-04-25T23:56:03.120715" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:03.120816" 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-04-25T23:56:03.099804" elapsed="0.021173">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:03.121081" elapsed="0.000022"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:03.095843" elapsed="0.025376">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:03.121298" elapsed="0.000021"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:03.093711" elapsed="0.027719">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:03.121766" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:03.121538" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:03.122075" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:03.121879" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:03.122371" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:03.122183" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:03.121513" elapsed="0.000959"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:03.092719" elapsed="0.029864">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:04.126263" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:04.125288" 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-04-25T23:56:04.140110" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:04.139841" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:04.140557" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:04.140311" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:04.145478" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:04.142775" elapsed="0.004392">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:04.140693" elapsed="0.006559">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.147442" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:04.147288" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:04.140669" elapsed="0.006862">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.147926" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:04.148062" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:04.148024" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:04.148006" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.148268" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:04.148338" 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-04-25T23:56:04.132607" elapsed="0.015836">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:04.148514" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:04.126856" elapsed="0.021754">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:04.148683" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:04.124566" elapsed="0.024247">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.149039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:04.148891" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.149257" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:04.149117" elapsed="0.000250"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:04.149528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:04.149390" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:04.148874" elapsed="0.000729"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:04.123512" elapsed="0.026218">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:05.153375" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:05.152353" 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-04-25T23:56:05.163504" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:05.163239" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:05.163971" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:05.163722" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:05.168946" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:05.166194" elapsed="0.004513">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:05.164093" elapsed="0.006705">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.170996" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:05.170838" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:05.164070" elapsed="0.007013">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.171496" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:05.171685" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:05.171624" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:05.171602" elapsed="0.000154"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.171898" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:05.171991" 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-04-25T23:56:05.157632" elapsed="0.014481">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:05.172215" elapsed="0.000021"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:05.153905" elapsed="0.018427">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:05.172467" elapsed="0.000018"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:05.151712" elapsed="0.020856">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.172820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:05.172645" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.173042" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:05.172899" elapsed="0.000198"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:05.173273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:05.173120" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:05.172628" elapsed="0.000722"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:05.150578" elapsed="0.022852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:06.177003" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:06.176038" 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-04-25T23:56:06.188305" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:06.187921" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:06.189154" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:06.188591" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:06.194173" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:06.191593" elapsed="0.004279">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:06.189322" elapsed="0.006635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.196145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:06.195993" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:06.189292" elapsed="0.006941">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.196615" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:06.196770" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:06.196730" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:06.196713" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.196977" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:06.197046" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:06.181793" elapsed="0.015359">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:06.197282" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:06.177555" elapsed="0.019825">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:06.197436" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:06.175378" elapsed="0.022150">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.197767" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:06.197604" elapsed="0.000253"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.198025" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:06.197881" elapsed="0.000198"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:06.198240" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:06.198103" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:06.197587" elapsed="0.000728"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:06.174301" elapsed="0.024093">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:07.201815" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:07.200824" 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-04-25T23:56:07.214306" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:07.214046" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:07.214791" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:07.214507" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:07.219565" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:07.216984" elapsed="0.004274">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:07.214910" elapsed="0.006433">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:07.221531" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:07.221379" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:07.214889" elapsed="0.006730">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:07.222011" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:07.222204" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:07.222161" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:07.222143" 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-04-25T23:56:07.222427" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:07.222497" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:07.208195" elapsed="0.014409">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:07.222680" elapsed="0.000030"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:07.202364" elapsed="0.020429">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:07.222849" elapsed="0.000018"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:07.200177" elapsed="0.022770">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:07.223170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:07.223022" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:07.223389" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:07.223249" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:07.223603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:07.223466" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:07.223006" elapsed="0.000675"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:07.199166" elapsed="0.024609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:08.227218" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:08.226242" 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-04-25T23:56:08.239877" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:08.239492" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:08.240546" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:08.240163" 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-04-25T23:56:08.245488" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:08.242893" elapsed="0.004270">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:08.240733" elapsed="0.006512">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.247432" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:08.247280" elapsed="0.000271"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:08.240703" elapsed="0.006872">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.247978" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:08.248113" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:08.248074" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:08.248057" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.248320" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:08.248390" 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-04-25T23:56:08.233425" elapsed="0.015102">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:08.248600" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:08.227796" elapsed="0.020917">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:08.248771" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:08.225588" elapsed="0.023274">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.249084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:08.248937" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.249302" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:08.249162" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:08.249513" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:08.249378" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:08.248920" elapsed="0.000667"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:08.224564" elapsed="0.025104">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:09.253552" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:09.252533" 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-04-25T23:56:09.264263" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:09.263996" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:09.264727" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:09.264463" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:09.269816" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:09.266952" elapsed="0.004678">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:09.264860" elapsed="0.006878">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.271932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:09.271781" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:09.264828" elapsed="0.007193">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.272406" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:09.272543" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:09.272503" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:09.272486" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.272766" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:09.272837" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:09.258313" elapsed="0.014633">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:09.273017" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:09.254208" elapsed="0.018902">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:09.273164" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:09.251879" elapsed="0.021376">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.273473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:09.273328" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.273705" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:09.273550" elapsed="0.000210"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:09.273917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:09.273782" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:09.273312" elapsed="0.000677"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:09.250738" elapsed="0.023327">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:10.275787" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:10.275317" 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-04-25T23:56:10.283382" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:10.283116" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:10.283848" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:10.283580" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:10.288702" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:10.286053" elapsed="0.004312">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:10.283967" elapsed="0.006483">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.290639" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:10.290487" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:10.283944" elapsed="0.006807">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.291120" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:10.291254" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:10.291216" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:10.291199" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.291458" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:10.291526" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:10.278779" elapsed="0.012852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:10.291719" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:10.276046" elapsed="0.015773">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:10.291874" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:10.275031" elapsed="0.016936">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.292187" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:10.292043" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.292401" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:10.292263" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:10.292613" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:10.292476" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:10.292026" elapsed="0.000698"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:10.274494" elapsed="0.018341">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:11.296941" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:11.295890" 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-04-25T23:56:11.308399" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:11.308135" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:11.308860" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:11.308596" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:11.313857" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:11.311084" elapsed="0.004499">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:11.308987" elapsed="0.006702">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.315901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:11.315746" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:11.308961" elapsed="0.007029">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.316372" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:11.316508" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:11.316468" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:11.316451" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.316733" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:11.316803" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:11.303570" elapsed="0.013341">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:11.316982" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:11.297554" elapsed="0.019524">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:11.317133" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:11.295164" elapsed="0.022062">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.317508" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:11.317358" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.317743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:11.317585" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:11.317955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:11.317820" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:11.317340" elapsed="0.000688"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:11.293995" elapsed="0.024112">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:12.321866" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:12.320842" 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-04-25T23:56:12.332879" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:12.332593" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:12.333324" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:12.333077" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:12.338419" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:12.335520" elapsed="0.004693">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:12.333451" elapsed="0.006851">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.340492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:12.340341" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:12.333422" elapsed="0.007158">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.340974" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:12.341109" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:12.341069" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:12.341052" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.341317" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:12.341384" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:12.328267" elapsed="0.013226">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:12.341562" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:12.322438" elapsed="0.019306">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:12.341801" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:12.320153" elapsed="0.021740">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.342118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:12.341967" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.342335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:12.342195" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:12.342546" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:12.342410" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:12.341950" elapsed="0.000668"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:12.318974" elapsed="0.023738">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:13.346508" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:13.345495" 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-04-25T23:56:13.361686" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:13.361286" elapsed="0.000507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:13.362279" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:13.362009" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:13.367395" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:13.364486" elapsed="0.004666">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:13.362407" elapsed="0.006835">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:13.369430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:13.369281" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:13.362378" elapsed="0.007140">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:13.369943" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:13.370084" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:13.370040" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:13.370023" 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-04-25T23:56:13.370294" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:13.370423" 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-04-25T23:56:13.355183" elapsed="0.015354">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:13.370607" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:13.347115" elapsed="0.023609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:13.370783" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:13.344819" elapsed="0.026055">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:13.371097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:13.370947" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:13.371312" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:13.371174" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:13.371521" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:13.371386" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:13.370931" elapsed="0.000662"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:13.343618" elapsed="0.028068">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:14.375477" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:14.374452" 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-04-25T23:56:14.431007" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:14.430650" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:14.431494" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:14.431243" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:14.436626" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:14.433862" elapsed="0.004538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:14.431622" elapsed="0.006867">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.438699" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:14.438528" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:14.431595" elapsed="0.007195">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.439237" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:14.439374" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:14.439335" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:14.439318" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.439583" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:14.439654" 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-04-25T23:56:14.425993" elapsed="0.013791">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:14.439856" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:14.376074" elapsed="0.063876">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:14.440004" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:14.373807" elapsed="0.066291">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.440320" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:14.440174" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.440538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:14.440397" elapsed="0.000195"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:14.440770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:14.440615" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:14.440157" elapsed="0.000688"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:14.372604" elapsed="0.068322">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:15.444734" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:15.443739" 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-04-25T23:56:15.459891" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:15.459464" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:15.460403" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:15.460154" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:15.465408" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:15.462624" elapsed="0.004534">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:15.460527" elapsed="0.006780">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.467502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:15.467349" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:15.460501" elapsed="0.007090">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.468022" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:15.468161" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:15.468121" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:15.468103" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.468370" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:15.468439" 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-04-25T23:56:15.451376" elapsed="0.017172">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:15.468620" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:15.445296" elapsed="0.023437">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:15.468788" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:15.443046" elapsed="0.025833">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.469096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:15.468952" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.469311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:15.469173" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:15.469520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:15.469386" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:15.468936" elapsed="0.000658"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:15.441910" elapsed="0.027777">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:16.473201" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:16.472238" 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-04-25T23:56:16.484595" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:16.484334" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:16.485060" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:16.484814" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:16.490050" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:16.487366" elapsed="0.004394">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:16.485263" elapsed="0.006582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:16.492033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:16.491881" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:16.485231" elapsed="0.006889">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:16.492490" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:16.492625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:16.492586" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:16.492569" 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-04-25T23:56:16.492852" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:16.492921" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:16.479554" elapsed="0.013473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:16.493098" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:16.473778" elapsed="0.019418">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:16.493250" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:16.471545" elapsed="0.021796">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:16.493560" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:16.493415" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:16.493796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:16.493638" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:16.494010" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:16.493873" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:16.493398" elapsed="0.000687"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:16.470489" elapsed="0.023674">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:17.497931" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:17.496933" 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-04-25T23:56:17.510694" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:17.510412" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:17.511147" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:17.510898" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:17.516032" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:17.513334" elapsed="0.004432">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:17.511268" elapsed="0.006586">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:17.518043" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:17.517892" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:17.511244" elapsed="0.006888">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:17.518530" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:17.518681" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:17.518625" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:17.518608" 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-04-25T23:56:17.518891" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:17.518960" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:17.504478" elapsed="0.014589">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:17.519138" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:17.498518" elapsed="0.020715">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:17.519287" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:17.496227" elapsed="0.023151">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:17.519596" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:17.519451" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:17.519833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:17.519692" elapsed="0.000249"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:17.520101" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:17.519965" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:17.519435" elapsed="0.000740"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:17.495125" elapsed="0.025128">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:18.523794" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:18.522788" 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-04-25T23:56:18.535946" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:18.535651" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:18.536393" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:18.536146" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:18.541448" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:18.538598" elapsed="0.004557">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:18.536515" elapsed="0.006728">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:18.543432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:18.543281" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:18.536491" elapsed="0.007043">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:18.543922" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:18.544082" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:18.544035" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:18.544015" 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-04-25T23:56:18.544321" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:18.544391" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:18.530154" elapsed="0.014344">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:18.544569" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:18.524345" elapsed="0.020337">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:18.544801" elapsed="0.000017"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:18.522128" elapsed="0.022770">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:18.545118" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:18.544972" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:18.545334" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:18.545195" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:18.545544" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:18.545410" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:18.544956" elapsed="0.000662"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:18.521042" elapsed="0.024671">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:19.549334" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:19.548355" 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-04-25T23:56:19.560936" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:19.560665" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:19.561387" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:19.561138" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:19.566210" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:19.563593" elapsed="0.004380">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:19.561509" elapsed="0.006551">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.568266" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:19.568096" elapsed="0.000251"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:19.561486" elapsed="0.006884">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.568760" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:19.568896" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:19.568857" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:19.568840" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.569101" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:19.569169" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:19.554412" elapsed="0.014881">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:19.569434" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:19.549925" elapsed="0.019607">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:19.569587" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:19.547720" elapsed="0.021978">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.569921" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:19.569775" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.570139" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:19.569999" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:19.570355" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:19.570218" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:19.569758" elapsed="0.000670"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:19.546521" elapsed="0.023985">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:20.574112" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:20.573144" 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-04-25T23:56:20.586436" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:20.586077" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:20.587117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:20.586735" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:20.592054" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:20.589364" elapsed="0.004397">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:20.587278" elapsed="0.006568">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:20.594035" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:20.593883" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:20.587253" elapsed="0.006871">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:20.594504" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:20.594719" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:20.594677" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:20.594641" 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-04-25T23:56:20.594955" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:20.595027" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:20.580058" elapsed="0.015080">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:20.595211" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:20.574699" elapsed="0.020609">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:20.595363" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:20.572481" elapsed="0.022974">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:20.595695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:20.595530" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:20.595919" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:20.595776" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:20.596133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:20.595996" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:20.595513" elapsed="0.000695"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:20.571364" elapsed="0.024939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:21.599757" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:21.598755" 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-04-25T23:56:21.612900" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:21.612512" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:21.613545" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:21.613204" 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-04-25T23:56:21.618956" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:21.615964" elapsed="0.004661">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:21.613731" elapsed="0.007000">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:21.620918" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:21.620767" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:21.613699" elapsed="0.007383">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:21.621493" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:21.621628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:21.621589" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:21.621572" 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-04-25T23:56:21.621855" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:21.621925" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:21.606207" elapsed="0.015825">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:21.622103" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:21.600306" elapsed="0.021893">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:21.622254" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:21.598112" elapsed="0.024234">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:21.622567" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:21.622421" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:21.622806" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:21.622644" elapsed="0.000220"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:21.623019" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:21.622886" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:21.622404" elapsed="0.000687"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:21.597089" elapsed="0.026079">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:22.626389" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:22.625461" 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-04-25T23:56:22.636534" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:22.636280" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:22.636998" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:22.636751" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:22.641799" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:22.639197" elapsed="0.004314">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:22.637111" elapsed="0.006484">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.643800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:22.643630" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:22.637091" elapsed="0.006797">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.644254" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:22.644386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:22.644349" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:22.644332" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.644589" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:22.644678" 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-04-25T23:56:22.631958" elapsed="0.012827">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:22.644855" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:22.627006" elapsed="0.017942">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:22.645002" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:22.624863" elapsed="0.020229">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.645308" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:22.645165" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.645520" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:22.645383" elapsed="0.000189"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:22.645743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:22.645594" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:22.645149" elapsed="0.000667"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:22.623888" elapsed="0.022004">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:23.649457" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:23.648490" 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-04-25T23:56:23.664139" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:23.663772" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:23.664726" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:23.664443" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:23.669630" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:23.666934" elapsed="0.004387">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:23.664847" elapsed="0.006559">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.671601" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:23.671448" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:23.664824" elapsed="0.006885">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.672114" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:23.672249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:23.672210" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:23.672193" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.672452" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:23.672521" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:23.655969" elapsed="0.016659">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:23.672717" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:23.650045" elapsed="0.022769">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:23.672869" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:23.647862" elapsed="0.025099">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.673182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:23.673036" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.673426" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:23.673261" elapsed="0.000232"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:23.673671" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:23.673521" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:23.673019" elapsed="0.000729"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:23.646763" elapsed="0.027121">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:24.677605" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:24.676592" 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-04-25T23:56:24.689094" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:24.688830" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:24.689538" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:24.689294" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:24.694567" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:24.691770" elapsed="0.004547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:24.689678" elapsed="0.006728">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.696596" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:24.696445" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:24.689637" elapsed="0.007064">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.697082" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:24.697215" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:24.697175" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:24.697159" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.697422" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:24.697489" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:24.682887" elapsed="0.014709">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:24.697682" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:24.678202" elapsed="0.019576">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:24.697832" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:24.675905" elapsed="0.022017">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.698200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:24.698054" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.698419" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:24.698278" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:24.698628" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:24.698494" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:24.698036" elapsed="0.000683"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:24.674772" elapsed="0.024033">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:25.702320" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:25.701359" 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-04-25T23:56:25.713387" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:25.713127" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:25.713853" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:25.713589" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:25.718784" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:25.716063" elapsed="0.004409">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:25.713973" elapsed="0.006593">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:25.720795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:25.720610" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:25.713950" elapsed="0.006933">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:25.721254" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:25.721387" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:25.721348" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:25.721331" 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-04-25T23:56:25.721626" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:25.721711" 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-04-25T23:56:25.707244" elapsed="0.014573">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:25.721888" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:25.702933" elapsed="0.019107">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:25.722096" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:25.700731" elapsed="0.021458">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:25.722415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:25.722263" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:25.722635" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:25.722495" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:25.722868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:25.722731" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:25.722246" elapsed="0.000697"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:25.699639" elapsed="0.023382">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:26.726168" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:26.725248" elapsed="0.000985"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:26.738970" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:26.738712" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:26.739418" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:26.739172" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:26.744065" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:26.741613" elapsed="0.004091">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:26.739545" elapsed="0.006242">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.745973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:26.745822" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:26.739526" elapsed="0.006535">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.746429" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:26.746561" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:26.746524" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:26.746507" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.746782" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:26.746898" 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-04-25T23:56:26.733504" elapsed="0.013500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:26.747075" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:26.726736" elapsed="0.020434">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:26.747226" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:26.724616" elapsed="0.022701">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.747565" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:26.747393" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.747805" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:26.747646" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:26.748016" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:26.747881" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:26.747376" elapsed="0.000713"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:26.723712" elapsed="0.024455">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:27.751697" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:27.750738" 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-04-25T23:56:27.763618" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:27.763237" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:27.764089" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:27.763838" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:27.769001" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:27.766305" elapsed="0.004402">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:27.764211" elapsed="0.006585">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:27.770984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:27.770832" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:27.764189" elapsed="0.006882">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:27.771519" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:27.771670" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:27.771615" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:27.771598" 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-04-25T23:56:27.771877" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:27.771946" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:27.757107" elapsed="0.014945">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:27.772124" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:27.752253" elapsed="0.019966">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:27.772278" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:27.750066" elapsed="0.022303">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:27.772586" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:27.772443" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:27.772819" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:27.772680" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:27.773028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:27.772895" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:27.772426" elapsed="0.000676"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:27.749004" elapsed="0.024176">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:28.776383" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:28.775449" 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-04-25T23:56:28.787389" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:28.787135" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:28.787851" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:28.787587" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:28.792592" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:28.790125" elapsed="0.004155">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:28.787964" elapsed="0.006449">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.794603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:28.794450" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:28.787944" elapsed="0.006767">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.795090" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:28.795226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:28.795187" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:28.795170" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.795435" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:28.795506" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:28.781138" elapsed="0.014472">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:28.795700" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:28.776951" elapsed="0.018848">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:28.795854" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:28.774849" elapsed="0.021098">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.796168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:28.796021" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.796386" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:28.796247" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:28.796608" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:28.796467" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:28.796005" elapsed="0.000693"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:28.773894" elapsed="0.022883">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:29.800054" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:29.799068" 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-04-25T23:56:29.812217" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:29.811958" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:29.812682" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:29.812420" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:29.817692" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:29.814911" elapsed="0.004421">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:29.812845" elapsed="0.006569">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.819607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:29.819450" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:29.812823" elapsed="0.006891">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.820107" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:29.820248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:29.820209" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:29.820193" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.820452" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:29.820522" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:29.806338" elapsed="0.014294">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:29.820722" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:29.800599" elapsed="0.020220">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:29.820875" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:29.798428" elapsed="0.022539">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.821190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:29.821042" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.821409" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:29.821269" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:29.821619" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:29.821486" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:29.821025" elapsed="0.000686"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:29.797453" elapsed="0.024339">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:30.825422" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:30.824456" 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-04-25T23:56:30.835953" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:30.835689" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:30.836400" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:30.836154" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:30.841443" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:30.838611" elapsed="0.004563">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:30.836520" elapsed="0.006739">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.843448" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:30.843296" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:30.836497" elapsed="0.007039">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.843929" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:30.844064" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:30.844025" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:30.844008" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.844268" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:30.844338" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:30.831294" elapsed="0.013148">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:30.844513" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:30.826011" elapsed="0.018601">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:30.844685" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:30.823820" elapsed="0.020959">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.845000" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:30.844854" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.845218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:30.845078" elapsed="0.000248"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:30.845489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:30.845350" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:30.844838" elapsed="0.000726"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:30.822733" elapsed="0.022914">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:31.849416" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:31.848417" 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-04-25T23:56:31.860958" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:31.860693" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:31.861408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:31.861161" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:31.866267" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:31.863613" elapsed="0.004382">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:31.861533" elapsed="0.006551">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.868290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:31.868135" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:31.861507" elapsed="0.006871">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.868773" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:31.868909" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:31.868869" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:31.868853" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.869115" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:31.869183" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:31.855901" elapsed="0.013391">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:31.869362" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:31.850018" elapsed="0.019438">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:31.869571" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:31.847713" elapsed="0.021969">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.869905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:31.869759" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.870123" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:31.869983" elapsed="0.000193"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:31.870336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:31.870199" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:31.869742" elapsed="0.000668"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:31.846560" elapsed="0.023927">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:32.873569" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:32.872700" elapsed="0.000933"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:32.883877" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:32.883603" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:32.884320" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:32.884077" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:32.888984" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:32.886503" elapsed="0.004114">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:32.884433" elapsed="0.006293">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.890910" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:32.890761" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:32.884414" elapsed="0.006583">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.891360" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:32.891492" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:32.891456" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:32.891439" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.891732" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:32.891802" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:32.877877" elapsed="0.014028">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:32.892014" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:32.874188" elapsed="0.017924">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:32.892168" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:32.872077" elapsed="0.020182">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.892478" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:32.892333" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.892717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:32.892555" elapsed="0.000217"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:32.893059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:32.892795" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:32.892316" elapsed="0.000817"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:32.871131" elapsed="0.022079">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:33.896358" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:33.895396" elapsed="0.001024"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:33.908564" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:33.908310" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:33.909024" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:33.908779" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:33.913570" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:33.911190" elapsed="0.004048">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:33.909137" elapsed="0.006184">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.915504" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:33.915355" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:33.909118" elapsed="0.006483">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.915983" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:33.916155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:33.916116" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:33.916098" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.916360" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:33.916430" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:33.902698" elapsed="0.013836">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:33.916605" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:33.896923" elapsed="0.019794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:33.916773" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:33.894807" elapsed="0.022059">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.917086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:33.916940" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.917302" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:33.917163" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:33.917512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:33.917378" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:33.916924" elapsed="0.000660"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:33.893877" elapsed="0.023799">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:34.921184" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:34.920153" 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-04-25T23:56:34.933372" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:34.933111" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:34.933838" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:34.933573" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:34.938718" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:34.936025" elapsed="0.004371">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:34.933960" elapsed="0.006520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.940682" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:34.940516" elapsed="0.000289"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:34.933936" elapsed="0.006894">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.941221" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:34.941358" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:34.941319" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:34.941301" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.941566" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:34.941636" 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-04-25T23:56:34.927527" elapsed="0.014234">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:34.941834" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:34.921786" elapsed="0.020144">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:34.941985" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:34.919480" elapsed="0.022598">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.942300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:34.942153" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.942540" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:34.942376" elapsed="0.000218"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:34.942765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:34.942617" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:34.942136" elapsed="0.000704"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:34.918435" elapsed="0.024483">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:35.946641" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:35.945596" 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-04-25T23:56:35.958055" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:35.957773" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:35.958514" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:35.958257" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:35.963625" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:35.960736" elapsed="0.004732">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:35.958639" elapsed="0.006922">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:35.965771" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:35.965601" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:35.958613" elapsed="0.007248">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:35.966242" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:35.966379" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:35.966338" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:35.966321" 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-04-25T23:56:35.966610" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:35.966698" 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-04-25T23:56:35.952411" elapsed="0.014401">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:35.966883" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:35.947244" elapsed="0.019733">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:35.967032" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:35.944963" elapsed="0.022159">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:35.967341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:35.967196" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:35.967557" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:35.967418" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:35.967787" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:35.967632" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:35.967179" elapsed="0.000681"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:35.943824" elapsed="0.024112">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:36.971692" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:36.970676" 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-04-25T23:56:36.984349" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:36.984082" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:36.984812" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:36.984547" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:36.989832" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:36.987018" elapsed="0.004520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:36.984938" elapsed="0.006689">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.991859" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:36.991682" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:36.984911" elapsed="0.007038">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.992336" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:36.992472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:36.992432" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:36.992415" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.992694" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:36.992764" 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-04-25T23:56:36.978427" elapsed="0.014444">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:36.992942" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:36.972319" elapsed="0.020716">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:36.993090" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:36.969980" elapsed="0.023201">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.993404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:36.993253" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.993624" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:36.993483" elapsed="0.000210"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:36.993854" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:36.993717" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:36.993237" elapsed="0.000691"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:36.968857" elapsed="0.025196">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:37.996108" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:37.995588" elapsed="0.000561"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:38.003800" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:38.003522" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:38.004244" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:38.003999" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:38.009292" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:38.006486" elapsed="0.004537">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:38.004371" elapsed="0.006741">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.011301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:38.011150" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:38.004343" elapsed="0.007047">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.011796" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:38.011950" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:38.011911" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:38.011894" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.012158" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:38.012226" 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-04-25T23:56:37.999196" elapsed="0.013137">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:38.012403" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:37.996380" elapsed="0.016116">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:38.012550" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:37.995262" elapsed="0.017378">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.012941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:38.012793" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.013194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:38.013050" elapsed="0.000197"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:38.013420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:38.013269" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:38.012773" elapsed="0.000723"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:37.994634" elapsed="0.018941">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:39.017393" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:39.016371" 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-04-25T23:56:39.029849" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:39.029559" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:39.030314" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:39.030051" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:39.035301" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:39.032548" elapsed="0.004501">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:39.030440" elapsed="0.006698">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.037338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:39.037176" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:39.030414" elapsed="0.007013">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.037987" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:39.038124" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:39.038086" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:39.038069" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.038340" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:39.038410" 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-04-25T23:56:39.024793" elapsed="0.013726">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:39.038589" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:39.017980" elapsed="0.020791">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:39.038827" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:39.015671" elapsed="0.023249">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.039140" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:39.038994" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.039372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:39.039217" elapsed="0.000211"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:39.039584" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:39.039450" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:39.038977" elapsed="0.000695"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:39.014422" elapsed="0.025331">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:40.043408" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:40.042383" 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-04-25T23:56:40.056864" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:40.056579" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:40.057311" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:40.057063" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:40.062489" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:40.059555" elapsed="0.004635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:40.057435" elapsed="0.006844">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.064467" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:40.064316" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:40.057410" elapsed="0.007144">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.064945" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:40.065079" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:40.065039" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:40.065023" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.065284" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:40.065411" 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-04-25T23:56:40.049915" elapsed="0.015604">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:40.065590" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:40.044015" elapsed="0.021687">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:40.065760" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:40.041737" elapsed="0.024113">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.066069" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:40.065924" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.066286" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:40.066146" elapsed="0.000215"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:40.066521" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:40.066384" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:40.065907" elapsed="0.000686"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:40.040582" elapsed="0.026116">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:41.069848" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:41.068937" elapsed="0.000978"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:41.081114" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:41.080751" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:41.081756" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:41.081393" 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-04-25T23:56:41.087028" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:41.084618" elapsed="0.004024">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:41.081915" elapsed="0.006831">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:41.088933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:41.088781" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:41.081888" elapsed="0.007131">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:41.089454" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:41.089586" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:41.089549" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:41.089532" 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-04-25T23:56:41.089809" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:41.089878" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:41.074634" elapsed="0.015349">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:41.090053" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:41.070388" elapsed="0.019760">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:41.090202" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:41.068299" elapsed="0.021994">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:41.090515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:41.090367" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:41.090746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:41.090592" elapsed="0.000210"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:41.090974" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:41.090824" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:41.090350" elapsed="0.000698"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:41.067326" elapsed="0.023801">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:42.094497" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:42.093555" elapsed="0.001012"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:42.106757" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:42.106481" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:42.107206" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:42.106959" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:42.111954" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:42.109419" elapsed="0.004202">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:42.107323" elapsed="0.006454">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.113974" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:42.113816" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:42.107301" elapsed="0.006762">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.114440" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:42.114574" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:42.114535" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:42.114518" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.114799" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:42.114868" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:42.100900" elapsed="0.014073">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:42.115045" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:42.095070" elapsed="0.020069">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:42.115193" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:42.092931" elapsed="0.022353">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.115530" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:42.115383" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.115795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:42.115629" elapsed="0.000220"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:42.116006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:42.115872" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:42.115366" elapsed="0.000713"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:42.091869" elapsed="0.024287">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:43.118722" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:43.118094" elapsed="0.000674"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:43.129209" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:43.128945" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:43.129672" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:43.129411" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:43.134737" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:43.131992" elapsed="0.004423">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:43.129861" elapsed="0.006640">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.136711" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:43.136537" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:43.129837" elapsed="0.006964">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.137173" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:43.137308" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:43.137269" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:43.137252" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.137513" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:43.137584" 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-04-25T23:56:43.122754" elapsed="0.014950">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:43.137779" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:43.119077" elapsed="0.018798">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:43.137932" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:43.117645" elapsed="0.020380">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.138247" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:43.138100" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.138466" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:43.138326" elapsed="0.000194"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:43.138695" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:43.138543" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:43.138083" elapsed="0.000688"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:43.116932" elapsed="0.021917">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:44.142677" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:44.141608" 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-04-25T23:56:44.153241" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:44.152972" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:44.153703" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:44.153441" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:44.158763" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:44.155924" elapsed="0.004600">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:44.153831" elapsed="0.006784">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.160826" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:44.160671" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:44.153803" elapsed="0.007112">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.161299" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:44.161435" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:44.161395" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:44.161378" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.161642" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:44.161727" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:44.148627" elapsed="0.013209">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:44.161907" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:44.143247" elapsed="0.018760">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:44.162061" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:44.140953" elapsed="0.021200">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.162374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:44.162227" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.162590" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:44.162452" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:44.162872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:44.162733" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:44.162211" elapsed="0.000736"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:44.139834" elapsed="0.023192">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:45.166840" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:45.165816" 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-04-25T23:56:45.178637" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:45.178367" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:45.179107" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:45.178857" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:45.184262" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:45.181347" elapsed="0.004697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:45.179236" elapsed="0.006898">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:45.186323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:45.186172" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:45.179208" elapsed="0.007202">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:45.186811" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:45.186949" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:45.186908" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:45.186891" 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-04-25T23:56:45.187157" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:45.187226" 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-04-25T23:56:45.173542" elapsed="0.013792">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:45.187404" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:45.167415" elapsed="0.020082">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:45.187614" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:45.165096" elapsed="0.022631">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:45.187951" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:45.187804" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:45.188169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:45.188030" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:45.188377" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:45.188244" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:45.187787" elapsed="0.000664"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:45.163946" elapsed="0.024582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:46.192059" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:46.191067" 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-04-25T23:56:46.202935" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:46.202669" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:46.203388" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:46.203140" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:46.208300" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:46.205585" elapsed="0.004461">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:46.203509" elapsed="0.006623">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.210319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:46.210169" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:46.203485" elapsed="0.006921">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.210799" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:46.210936" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:46.210895" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:46.210879" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.211147" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:46.211215" 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-04-25T23:56:46.198332" elapsed="0.012989">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:46.211451" elapsed="0.000017"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:46.192615" elapsed="0.018933">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:46.211603" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:46.190400" elapsed="0.021311">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.211932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:46.211786" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.212146" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:46.212008" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:46.212355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:46.212221" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:46.211770" elapsed="0.000657"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:46.189271" elapsed="0.023232">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:47.215612" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:47.214721" elapsed="0.001020"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:47.230022" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:47.229764" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:47.230470" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:47.230223" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:47.235304" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:47.232682" elapsed="0.004284">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:47.230584" elapsed="0.006469">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.237238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:47.237087" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:47.230565" elapsed="0.006758">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.237701" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:47.237887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:47.237849" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:47.237831" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.238093" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:47.238161" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:47.221880" elapsed="0.016386">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:47.238337" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:47.216226" elapsed="0.022206">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:47.238485" elapsed="0.000016"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:47.214091" elapsed="0.024486">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.238816" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:47.238666" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.239033" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:47.238894" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:47.239241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:47.239108" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:47.238634" elapsed="0.000679"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:47.213140" elapsed="0.026273">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:48.242748" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:48.241796" elapsed="0.001022"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:48.253898" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:48.253516" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:48.254515" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:48.254174" 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-04-25T23:56:48.259820" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:48.257214" elapsed="0.004277">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:48.254693" elapsed="0.006882">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.261783" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:48.261611" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:48.254644" elapsed="0.007282">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.262309" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:48.262442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:48.262403" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:48.262386" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.262665" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:48.262737" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:48.247235" elapsed="0.015610">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:48.262916" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:48.243291" elapsed="0.019721">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:48.263066" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:48.241160" elapsed="0.021997">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.263391" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:48.263230" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.263607" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:48.263468" elapsed="0.000213"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:48.263839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:48.263704" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:48.263214" elapsed="0.000698"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:48.240169" elapsed="0.023823">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:49.267753" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:49.266717" 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-04-25T23:56:49.278297" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:49.278021" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:49.278763" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:49.278498" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:49.283879" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:49.281027" elapsed="0.004762">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:49.278891" elapsed="0.006989">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:49.286072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:49.285920" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:49.278864" elapsed="0.007296">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:49.286538" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:49.286692" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:49.286634" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:49.286617" 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-04-25T23:56:49.286900" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:49.286968" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:49.273668" elapsed="0.013410">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:49.287148" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:49.268324" elapsed="0.018918">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:49.287296" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:49.266045" elapsed="0.021340">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:49.287598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:49.287457" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:49.287830" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:49.287691" elapsed="0.000191"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:49.288034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:49.287904" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:49.287441" elapsed="0.000663"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:49.264894" elapsed="0.023286">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:50.292185" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:50.291142" 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-04-25T23:56:50.304154" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:50.303890" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:50.304600" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:50.304354" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:50.309501" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:50.306827" elapsed="0.004408">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:50.304745" elapsed="0.006577">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:50.311527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:50.311375" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:50.304715" elapsed="0.006904">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:50.312016" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:50.312157" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:50.312117" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:50.312098" 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-04-25T23:56:50.312366" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:50.312433" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:50.298745" elapsed="0.013798">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:50.312613" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:50.292785" elapsed="0.019939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:50.312779" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:50.290456" elapsed="0.022415">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:50.313090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:50.312943" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:50.313304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:50.313166" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:50.313513" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:50.313378" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:50.312927" elapsed="0.000657"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:50.289317" elapsed="0.024398">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.317566" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.316546" 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-04-25T23:56:51.332964" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.332687" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.333417" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.333168" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:51.338361" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.335632" elapsed="0.004465">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.333544" elapsed="0.006642">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.340376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.340225" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.333516" elapsed="0.006947">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.340856" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.340992" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.340953" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.340936" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.341205" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.341273" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.328337" elapsed="0.013044">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.341451" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.318175" elapsed="0.023369">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.341598" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.315882" elapsed="0.025828">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.342082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.341933" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.342306" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.342164" elapsed="0.000196"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.342517" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.342382" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.341915" elapsed="0.000676"/>
</if>
<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>
<status status="FAIL" start="2026-04-25T23:56:51.314610" elapsed="0.028079">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:56:51.342787" level="FAIL">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>60s</arg>
<arg>1s</arg>
<arg>Check_Config_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>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.791176" elapsed="60.551706">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:55:50.723461" elapsed="60.619622">Keyword 'Check_Config_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t16" name="Modify_Device_Data_Again" line="127">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:51.346536" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:51.346275" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.347897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.347786" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.347767" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.353010" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.352904" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.352886" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.354076" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.353690" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.354559" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:51.354264" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:51.354628" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:56:51.354809" 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-04-25T23:56:51.353301" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.360427" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.360320" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.360301" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.361789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.361672" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.361633" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.362379" level="INFO">${karaf_connection_index} = 70</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.362007" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.362882" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.362600" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.363794" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.363488" elapsed="0.001245">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.364927" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:51.364974" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.363080" elapsed="0.001918"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.365878" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.365568" elapsed="0.001340">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.367121" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:51.367167" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.365174" elapsed="0.002017"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.368120" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.367485" elapsed="0.000715">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.367267" elapsed="0.001179">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.367248" elapsed="0.001235">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.368644" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.368888" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.368748" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.368730" elapsed="0.000256"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.369018" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.372081" elapsed="0.000157"/>
</kw>
<msg time="2026-04-25T23:56:51.372310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.371405" 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-04-25T23:56:51.373331" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.374346" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.369921" elapsed="0.004539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.369294" elapsed="0.005281"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.361347" elapsed="0.013327">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</status>
</kw>
<msg time="2026-04-25T23:56:51.374779" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.374823" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Again"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.360644" elapsed="0.014203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.375042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.374934" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.374915" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.375930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.375826" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.375808" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.376273" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.376410" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.376145" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.376865" level="INFO">{1: 70}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.376588" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.377304" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.377059" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.377991" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:56:51.378405" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:51.378452" level="INFO">${old_connection_index} = 70</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.377503" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.379333" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.381424" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.381008" elapsed="0.001051">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.379749" elapsed="0.002387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.383604" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.382369" elapsed="0.001672"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:51.378788" elapsed="0.005352"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.378553" elapsed="0.005638"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.378533" elapsed="0.005684"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.385160" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.384757" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:51.385235" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.385386" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.384420" elapsed="0.000991"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.385563" elapsed="0.000495"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.386340" level="INFO">index=71
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.386231" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.386611" elapsed="0.002433"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.389473" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:51.390465" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.389208" elapsed="0.001659">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.400987" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:56:51.401362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.399611" elapsed="0.001839"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.401792" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.402054" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.391640" elapsed="0.010554"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.391136" elapsed="0.011150"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.375514" elapsed="0.026856">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.402722" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.402795" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.359984" elapsed="0.042914">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:51.403003" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.403045" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.355245" elapsed="0.047824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.403393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.403145" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.403127" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:51.355089" elapsed="0.048404"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:51.354894" elapsed="0.048631"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:51.352526" elapsed="0.051052"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:51.347468" elapsed="0.056165"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.346981" elapsed="0.056976"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:51.344138" elapsed="0.059874"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.404618" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:51.404179" elapsed="0.000466"/>
</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-04-25T23:56:51.438245" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.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-04-25T23:56:51.437870" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.439036" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.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-04-25T23:56:51.438803" elapsed="0.000296">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.439192" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.438447" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.439775" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.439377" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.440096" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:51.440261" 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-04-25T23:56:51.439961" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.440696" 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-04-25T23:56:51.440440" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.441730" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.441456" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.442191" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.441930" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.442926" 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-04-25T23:56:51.442598" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:51.443717" 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-04-25T23:56:51.443452" elapsed="0.000292"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:51.443794" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:51.443945" 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-04-25T23:56:51.443136" elapsed="0.000834"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.444117" elapsed="0.000224"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:51.442449" elapsed="0.001933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.444932" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:51.444621" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:51.445696" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.445447" elapsed="0.000276"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:51.445772" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.445922" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:51.445138" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.446094" elapsed="0.000219"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:51.444491" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:51.442267" elapsed="0.004146"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:51.446456" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:56:51.446611" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:51.441138" elapsed="0.005498"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.440842" elapsed="0.005846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.446861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.446713" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.440822" elapsed="0.006115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.447811" level="INFO">${final_text} = /restconf/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-04-25T23:56:51.447197" elapsed="0.000642"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:51.447887" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:51.437238" elapsed="0.010773"/>
</kw>
<msg time="2026-04-25T23:56:51.448065" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.424433" elapsed="0.023678"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.460691" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.473107" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.485389" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.485578" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.485766" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.486141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.485989" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.485975" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.486359" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.486526" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.486706" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:51.485948" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.485844" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.486930" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.487004" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:51.487120" level="INFO">${uri} = /restconf/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-04-25T23:56:51.420164" elapsed="0.066982"/>
</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-04-25T23:56:51.513438" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.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-04-25T23:56:51.513067" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.514180" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.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-04-25T23:56:51.513975" elapsed="0.000267">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2.titanium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.514333" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.513623" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.514916" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/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-04-25T23:56:51.514517" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.515238" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:51.515394" level="INFO">${template} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:56:51.515101" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.515840" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:56:51.515575" 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-04-25T23:56:51.516237" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.515952" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.516772" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.516464" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.516320" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.515933" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.517432" level="INFO">${final_text} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:56:51.516997" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:51.517509" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:51.512447" elapsed="0.005185"/>
</kw>
<msg time="2026-04-25T23:56:51.517701" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.499911" elapsed="0.017838"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.530267" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.542590" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.555027" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.555219" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.555390" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.555761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.555606" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.555592" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.555977" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.556140" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.556338" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:51.555564" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.555463" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.556561" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.556634" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:56:51.556771" level="INFO">${data} = &lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:56:51.497271" elapsed="0.059528"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.558059" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.557826" elapsed="0.000294">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod2/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.558212" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.557454" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.558548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.558307" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.559095" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.558806" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.558627" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.558289" elapsed="0.000891"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.561511" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.559330" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:56:51.561599" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:51.561774" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod2/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:56:51.557127" elapsed="0.004671"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.563166" level="INFO">/restconf/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-04-25T23:56:51.562921" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.563595" level="INFO">&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;
&lt;l&gt;Another 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-04-25T23:56:51.563360" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.564046" 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-04-25T23:56:51.563804" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.564471" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.564235" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.565318" 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-04-25T23:56:51.565128" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:56:51.565713" 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-04-25T23:56:51.565517" elapsed="0.000222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.565885" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.566482" 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-04-25T23:56:51.566239" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:56:51.566566" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:51.566740" 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-04-25T23:56:51.564727" elapsed="0.002038"/>
</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-04-25T23:56:51.571594" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.569116" elapsed="0.004128">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.566881" elapsed="0.006446">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.573524" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.573360" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.566862" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.574001" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.574129" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.574093" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.574076" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.574330" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.574395" 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-04-25T23:56:51.562124" elapsed="0.012374">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.574572" 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-04-25T23:56:51.409223" elapsed="0.165456">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.574962" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.574787" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.574770" elapsed="0.000280"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.575082" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}datamod2</arg>
<arg>${mapping}</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-04-25T23:56:51.404917" elapsed="0.170262">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.343535" elapsed="0.231788">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t17" name="Check_Device_Data_Is_Modified_Again" line="132">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:51.578693" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:51.578413" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.579931" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.579822" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.579804" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.585014" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.584909" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.584891" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.586110" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.585727" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.586589" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:51.586294" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:51.586674" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:51.586831" 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-04-25T23:56:51.585309" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.592274" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.592167" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.592148" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.593534" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.593427" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.593409" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.594126" level="INFO">${karaf_connection_index} = 71</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.593769" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.594556" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.594313" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.595403" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.595138" elapsed="0.001225">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.596540" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:51.596586" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.594756" elapsed="0.001853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.597466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.597182" elapsed="0.001412">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.598800" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:51.598846" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.596797" elapsed="0.002072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.599776" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.599162" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.598946" elapsed="0.001145">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.598926" elapsed="0.001203">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.600294" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.600564" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.600380" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.600363" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.600713" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.603912" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:56:51.604133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.603112" elapsed="0.001120"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.605147" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.606101" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.601580" elapsed="0.004634"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.600970" elapsed="0.005358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.593116" elapsed="0.013297">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</status>
</kw>
<msg time="2026-04-25T23:56:51.606515" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.606558" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Modified_Again"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.592486" elapsed="0.014096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.606852" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.606742" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.606640" elapsed="0.000278"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.607708" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.607588" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.607570" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.608038" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.608140" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.607923" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.608566" level="INFO">{1: 71}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.608313" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.609014" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.608773" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.609576" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:56:51.610008" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:51.610053" level="INFO">${old_connection_index} = 71</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.609221" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.610954" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.613028" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.612598" elapsed="0.001000">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.611347" elapsed="0.002347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.615345" elapsed="0.000369"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.613927" elapsed="0.001850"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:51.610368" elapsed="0.005509"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.610152" elapsed="0.005777"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.610132" elapsed="0.005854"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.616925" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.616507" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:51.617000" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.617160" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.616188" 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-04-25T23:56:51.617340" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.618043" level="INFO">index=72
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.617934" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.618307" elapsed="0.002400"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.621137" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:51.622053" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.620867" elapsed="0.001554">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.632928" elapsed="0.000348"/>
</kw>
<msg time="2026-04-25T23:56:51.633335" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.631622" elapsed="0.001801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.633766" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.634023" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.623347" elapsed="0.010816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.622838" elapsed="0.011373"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.607300" elapsed="0.026993">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.634619" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.634783" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.591833" elapsed="0.043055">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:51.634992" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.635035" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.587214" elapsed="0.047844"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.635423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.635136" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.635116" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:51.587076" elapsed="0.048446"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:51.586908" elapsed="0.048642"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:51.584535" elapsed="0.051068"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:51.579520" elapsed="0.056158"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.579104" elapsed="0.056621"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:51.576239" elapsed="0.059576"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.637080" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.636682" 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-04-25T23:56:51.644466" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.644214" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.644942" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.644677" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:51.649420" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.647096" elapsed="0.003948">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.645053" elapsed="0.006073">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.651315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.651159" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.645035" elapsed="0.006367">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.651783" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.651915" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.651879" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.651862" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.652115" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.652184" 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-04-25T23:56:51.639765" elapsed="0.012520">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.652355" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.637315" elapsed="0.015133">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.652503" elapsed="0.000014"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.636408" elapsed="0.016184">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.652828" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.652681" elapsed="0.000253"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.653105" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.652959" elapsed="0.000200"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.653319" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.653182" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.652663" elapsed="0.000730"/>
</if>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Another Modified Content&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<status status="FAIL" start="2026-04-25T23:56:51.636019" elapsed="0.017453">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.575672" elapsed="0.077934">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t18" name="Modify_Device_Data_Label_Via_Json" line="137">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:51.656995" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:51.656712" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.658236" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.658125" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.658107" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.664709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.664588" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.664569" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.665790" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.665393" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.666274" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:51.665976" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:51.666344" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.666497" 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-04-25T23:56:51.665022" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.671968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.671862" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.671843" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.673234" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.673130" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.673112" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.673825" level="INFO">${karaf_connection_index} = 72</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.673439" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.674251" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.674005" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.675089" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.674828" elapsed="0.001174">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.676181" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:51.676227" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.674430" elapsed="0.001819"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.677090" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.676823" elapsed="0.001389">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.678388" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:51.678434" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.676412" elapsed="0.002045"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.679371" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.678780" elapsed="0.000669">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.678531" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.678512" elapsed="0.001220">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.679893" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.680118" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.679980" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.679963" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.680245" 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-04-25T23:56:51.683376" elapsed="0.000151"/>
</kw>
<msg time="2026-04-25T23:56:51.683597" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.682550" elapsed="0.001160"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.684599" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.685553" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.681117" elapsed="0.004576"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.680494" elapsed="0.005316"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.672829" elapsed="0.013066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</status>
</kw>
<msg time="2026-04-25T23:56:51.685995" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.686037" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Modify_Device_Data_Label_Via_Json"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.672180" elapsed="0.013880"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.686242" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.686136" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.686118" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.687160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.687057" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.687040" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.687482" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.687582" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.687369" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.688028" level="INFO">{1: 72}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.687771" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.688459" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.688218" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.689061" elapsed="0.000312"/>
</kw>
<msg time="2026-04-25T23:56:51.689472" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:51.689517" level="INFO">${old_connection_index} = 72</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.688705" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.690409" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.692708" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.692231" elapsed="0.001022">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.690979" elapsed="0.002350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.694829" elapsed="0.000356"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.693558" elapsed="0.001693"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:51.689917" elapsed="0.005433"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.689691" elapsed="0.005711"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.689630" elapsed="0.005797"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.696355" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.695955" elapsed="0.000426"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:51.696428" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.696587" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.695624" elapsed="0.000987"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.696810" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.697541" level="INFO">index=73
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.697410" elapsed="0.000380"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.697934" elapsed="0.002435"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.700828" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:51.701795" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.700539" elapsed="0.001622">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.712600" elapsed="0.000339"/>
</kw>
<msg time="2026-04-25T23:56:51.712996" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.711275" elapsed="0.001809"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.713408" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.713692" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.702951" elapsed="0.010885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.702430" elapsed="0.011454"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.686769" elapsed="0.027198">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.714298" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.714370" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.671510" elapsed="0.042963">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:51.714615" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.714898" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.666895" elapsed="0.048029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.715253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.715002" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.714984" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:51.666758" elapsed="0.048594"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:51.666572" elapsed="0.048809"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:51.664224" elapsed="0.051210"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:51.657838" elapsed="0.057651"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.657408" elapsed="0.058126"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:51.654559" elapsed="0.061026"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.716179" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:51.715759" elapsed="0.000447"/>
</kw>
<kw name="Put_As_Json_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-04-25T23:56:51.753173" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.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-04-25T23:56:51.752798" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.753925" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.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-04-25T23:56:51.753707" elapsed="0.000280">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.754079" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.753359" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.754643" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.754263" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.754980" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:51.755175" 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-04-25T23:56:51.754846" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.755604" 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-04-25T23:56:51.755361" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.756612" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.756357" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.757095" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.756834" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.757778" 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-04-25T23:56:51.757466" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:51.758540" 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-04-25T23:56:51.758304" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:51.758674" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:56:51.758836" 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-04-25T23:56:51.757986" elapsed="0.000874"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.759012" elapsed="0.000223"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:51.757336" elapsed="0.001941"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.759833" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:51.759519" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:51.760624" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.760390" elapsed="0.000277"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:51.760720" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.760871" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:51.760042" elapsed="0.000852"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.761044" elapsed="0.000225"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:51.759389" elapsed="0.001922"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:51.757169" elapsed="0.004177"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:51.761388" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:56:51.761544" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:51.756026" elapsed="0.005543"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.755737" elapsed="0.005864"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.761789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.761626" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.755718" elapsed="0.006148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.762562" level="INFO">${final_text} = /restconf/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-04-25T23:56:51.762005" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:51.762638" elapsed="0.000057"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:51.752166" elapsed="0.010627"/>
</kw>
<msg time="2026-04-25T23:56:51.762847" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.739429" elapsed="0.023465"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.775460" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.787826" elapsed="0.000035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.800285" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.800511" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.800701" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.801063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.800922" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.800908" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.801280" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.801445" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.801608" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:51.800881" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.800778" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.801845" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.801921" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:51.802039" level="INFO">${uri} = /restconf/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-04-25T23:56:51.735166" elapsed="0.066899"/>
</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-04-25T23:56:51.828399" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.828025" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.829134" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.828930" elapsed="0.000267">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson.titanium/data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.829289" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.828585" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.829876" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.829476" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.830195" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:51.830319" level="INFO">${template} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:51.830061" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.830754" level="INFO">{
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.830497" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:56:51.831154" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.830864" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.831728" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.831387" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.831242" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.830846" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.832386" level="INFO">${final_text} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:56:51.831954" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:51.832499" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:51.827375" elapsed="0.005252"/>
</kw>
<msg time="2026-04-25T23:56:51.832696" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.814796" elapsed="0.017948"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.845411" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.857749" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.870205" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.870398" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.870569" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.870946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.870805" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.870791" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.871163" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.871341" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.871513" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:51.870763" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.870645" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.871749" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.871826" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:51.871938" level="INFO">${data} = {
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</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-04-25T23:56:51.812054" elapsed="0.059909"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:51.873252" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.873015" elapsed="0.000299">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamodjson/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:51.873406" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:51.872674" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.873760" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.873502" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.874293" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.874002" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.873843" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.873484" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.876717" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.874523" elapsed="0.002221"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:56:51.876795" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.876949" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamodjson/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:56:51.872334" elapsed="0.004640"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.878335" level="INFO">/restconf/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-04-25T23:56:51.878090" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.878781" level="INFO">{
  "test:cont": {
    "l":"Content Modified via JSON"
  }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.878529" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.879237" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.878973" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.879682" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.879427" elapsed="0.000299"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.880506" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:56:51.880320" elapsed="0.000212"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:56:51.880868" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:56:51.880697" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.881040" elapsed="0.000185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.881623" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.881378" elapsed="0.000304"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:56:51.881725" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.881878" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:56:51.879923" elapsed="0.001979"/>
</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-04-25T23:56:51.886694" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.884223" elapsed="0.004107">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.881972" elapsed="0.006441">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.888595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.888446" elapsed="0.000274"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.881955" elapsed="0.006790">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:51.889108" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.889240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.889204" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.889188" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.889438" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.889502" 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-04-25T23:56:51.877294" elapsed="0.012309">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.889696" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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-04-25T23:56:51.724397" elapsed="0.165394">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.890071" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.889898" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.889882" elapsed="0.000277"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.890193" elapsed="0.000016"/>
</return>
<arg>${directory_with_template_folders}${/}datamodjson</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Put_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.720183" elapsed="0.170104">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a JSON request to change the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.653983" elapsed="0.236444">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t19" name="Check_Device_Data_Label_Is_Modified_Via_Json" line="144">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:51.894020" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:51.893760" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.895277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.895169" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.895151" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.900353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.900248" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.900230" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.901406" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.901027" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.901937" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:51.901590" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:51.902009" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:51.902164" 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-04-25T23:56:51.900637" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.907632" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.907526" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.907507" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.908928" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.908821" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.908803" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.909487" 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-04-25T23:56:51.909136" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.909933" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.909686" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.910775" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.910500" elapsed="0.001126">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.911821" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:51.911867" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.910117" elapsed="0.001774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.912740" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.912441" elapsed="0.001307">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.913922" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:51.913968" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.912056" elapsed="0.001935"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.914899" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.914281" elapsed="0.000723">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.914065" elapsed="0.001033">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.914047" elapsed="0.001230">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.915438" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.915682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.915525" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.915508" elapsed="0.000271"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.915811" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.918853" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:56:51.919096" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.918181" elapsed="0.001128"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.920247" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.921196" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.916638" elapsed="0.004672"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.916064" elapsed="0.005391"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.908491" elapsed="0.013049">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</status>
</kw>
<msg time="2026-04-25T23:56:51.921642" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.921770" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Label_Is_Modified_Via_Json"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.907872" elapsed="0.013923"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.921981" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.921874" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.921855" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.922840" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.922735" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.922717" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.923184" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.923286" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:51.923068" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.923732" level="INFO">{1: 73}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.923460" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.924166" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.923927" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.924744" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:56:51.925159" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:51.925209" 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-04-25T23:56:51.924364" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.926214" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.928318" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.927901" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.926608" elapsed="0.002346"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.930466" elapsed="0.000376"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.929189" elapsed="0.001717"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:51.925525" elapsed="0.005482"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:51.925309" elapsed="0.005751"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.925290" elapsed="0.005796"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.932025" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.931607" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:51.932101" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:51.932252" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.931288" elapsed="0.000989"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:51.932431" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.933132" level="INFO">index=74
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:51.933022" 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-04-25T23:56:51.933436" elapsed="0.003255"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.937117" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:51.938103" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.936858" elapsed="0.001623">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.948430" elapsed="0.000364"/>
</kw>
<msg time="2026-04-25T23:56:51.948853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.947150" elapsed="0.001791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.949267" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.949528" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.939310" elapsed="0.010545"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.938797" elapsed="0.011109"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.922431" elapsed="0.027557">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.950322" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.950397" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.907192" elapsed="0.043309">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:51.950605" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:51.950683" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.902550" elapsed="0.048160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.951043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.950794" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.950773" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:51.902409" elapsed="0.048734"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:51.902241" elapsed="0.048935"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:51.899881" elapsed="0.051350"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:51.894870" elapsed="0.056415"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.894435" elapsed="0.056894"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:51.891488" elapsed="0.059893"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.952816" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:51.952421" 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-04-25T23:56:51.960327" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.960069" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.960789" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:51.960525" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:51.965455" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.963004" elapsed="0.004119">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.960900" elapsed="0.006304">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.967388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.967239" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.960882" elapsed="0.006593">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.967853" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.967984" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.967948" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.967932" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.968187" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.968257" 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-04-25T23:56:51.955465" elapsed="0.012894">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.968428" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.953049" elapsed="0.015472">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.968575" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.952161" elapsed="0.016518">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.968899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.968756" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.969113" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.968975" elapsed="0.000190"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.969326" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.969190" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.968739" elapsed="0.000659"/>
</if>
<arg>&lt;data xmlns="${ODL_NETCONF_NAMESPACE}"&gt;&lt;cont xmlns="urn:opendaylight:test:netconf:crud"&gt;&lt;l&gt;Content Modified via JSON&lt;/l&gt;&lt;/cont&gt;&lt;/data&gt;</arg>
<status status="FAIL" start="2026-04-25T23:56:51.951580" elapsed="0.017893">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.890883" elapsed="0.078725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t20" name="Create_Car_List" line="149">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:51.972817" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:51.972541" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.974044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.973936" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.973918" elapsed="0.000192"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.979152" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.979044" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.979026" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.980217" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:51.979837" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.980715" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:51.980403" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:51.980786" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:51.980940" 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-04-25T23:56:51.979447" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.986394" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.986287" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.986268" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.987695" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:51.987561" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:51.987543" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:51.988260" 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-04-25T23:56:51.987903" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.988702" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.988441" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.989534" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.989273" elapsed="0.001133">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.990584" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:51.990628" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.988885" elapsed="0.001787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:51.991496" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.991223" elapsed="0.001332">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:51.992754" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:51.992800" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.990836" elapsed="0.001987"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:51.995233" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.993111" elapsed="0.002203">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:51.992897" elapsed="0.002511">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:51.992878" elapsed="0.002568">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.995645" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:51.995905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:51.995765" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:51.995748" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:51.996035" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:51.999065" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:56:51.999283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:51.998426" 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-04-25T23:56:52.000301" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.001295" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:51.996960" elapsed="0.004448"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:51.996294" elapsed="0.005228"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.987261" elapsed="0.014344">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</status>
</kw>
<msg time="2026-04-25T23:56:52.001727" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.001772" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Create_Car_List"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.986623" elapsed="0.015172"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.001978" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.001872" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.001853" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.002853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.002748" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.002730" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.003178" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.003279" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.003064" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.003738" level="INFO">{1: 74}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.003452" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.004241" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.003932" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.004814" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:56:52.005236" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.005292" 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-04-25T23:56:52.004440" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.006334" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.008972" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.008350" elapsed="0.001231">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.006852" elapsed="0.002833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.011573" elapsed="0.000480"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.009960" elapsed="0.002180"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.005696" elapsed="0.006555"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.005412" elapsed="0.006938"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.005388" elapsed="0.006992"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.013710" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.013226" elapsed="0.000515"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.013800" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:56:52.013981" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.012619" elapsed="0.001389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.014190" elapsed="0.000544"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.015067" level="INFO">index=75
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.014939" elapsed="0.000508"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.015607" elapsed="0.002413"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.018459" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.019323" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.018186" elapsed="0.001595">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.030241" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:56:52.030617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.028928" elapsed="0.001800"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.031053" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.031314" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.020580" elapsed="0.010875"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.020065" elapsed="0.011438"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.002433" elapsed="0.029152">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.031952" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.032027" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.985952" elapsed="0.046182">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.032264" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.032317" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.981329" elapsed="0.051017"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.032898" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.032430" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.032411" elapsed="0.000567"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:51.981190" elapsed="0.051812"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:51.981019" elapsed="0.052016"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:51.978681" elapsed="0.054411"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:51.973635" elapsed="0.059519"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:51.973222" elapsed="0.060031"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:51.970379" elapsed="0.062936"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.033941" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:52.033485" elapsed="0.000483"/>
</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-04-25T23:56:52.068260" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.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-04-25T23:56:52.067854" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.069032" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.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-04-25T23:56:52.068799" elapsed="0.000297">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.069189" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.068454" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.069777" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.069376" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.070108" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.070304" 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-04-25T23:56:52.069972" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.070753" 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-04-25T23:56:52.070485" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.071773" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.071500" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.072234" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.071973" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.072923" 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-04-25T23:56:52.072610" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.073722" 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-04-25T23:56:52.073453" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.073798" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:52.073972" 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-04-25T23:56:52.073132" elapsed="0.000865"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.074147" elapsed="0.000226"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:52.072480" elapsed="0.001934"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.074970" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:52.074671" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.075738" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.075489" elapsed="0.000275"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.075813" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.075961" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:52.075176" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.076173" elapsed="0.000225"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:52.074526" elapsed="0.001914"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.072310" elapsed="0.004164"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.076516" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:52.076688" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:52.071160" elapsed="0.005554"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.070863" elapsed="0.005884"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.076920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.076772" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.070845" elapsed="0.006150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.077743" level="INFO">${final_text} = /restconf/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-04-25T23:56:52.077138" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.077829" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.067226" elapsed="0.010736"/>
</kw>
<msg time="2026-04-25T23:56:52.078018" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.054242" elapsed="0.023824"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.090691" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.103083" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.115687" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.115880" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.116051" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.116410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.116270" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.116256" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.116627" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.116809" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.116973" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.116229" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.116126" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.117235" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.117310" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:56:52.117427" level="INFO">${uri} = /restconf/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-04-25T23:56:52.049909" elapsed="0.067544"/>
</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-04-25T23:56:52.142272" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.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-04-25T23:56:52.141898" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.143007" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.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-04-25T23:56:52.142803" elapsed="0.000265">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.143161" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.142459" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.143744" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/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-04-25T23:56:52.143345" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.144063" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.144185" level="INFO">${template} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:52.143930" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.144603" level="INFO">&lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.144365" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:56:52.145016" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.144731" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.145556" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.145241" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.145098" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.144712" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.146244" level="INFO">${final_text} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&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-04-25T23:56:52.145803" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.146321" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.141249" elapsed="0.005196"/>
</kw>
<msg time="2026-04-25T23:56:52.146497" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.128515" elapsed="0.018028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.159278" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.171673" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.184060" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.184250" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.184422" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.184801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.184643" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.184629" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.185017" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.185191" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.185356" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.184600" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.184496" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.185578" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.185667" elapsed="0.000017"/>
</return>
<msg time="2026-04-25T23:56:52.185787" level="INFO">${data} = &lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&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-04-25T23:56:52.127670" elapsed="0.058145"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.187050" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.186819" elapsed="0.000292">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/cars/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.187205" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.186465" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.187544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.187302" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.188132" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.187840" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.187674" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.187283" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.190576" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.188364" elapsed="0.002239"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:56:52.190667" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:56:52.190824" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/cars/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:56:52.186145" elapsed="0.004704"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.192373" level="INFO">/restconf/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-04-25T23:56:52.192128" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.192825" level="INFO">&lt;cars xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;car-entry&gt;
    &lt;id&gt;KEEP&lt;/id&gt;
  &lt;/car-entry&gt;
&lt;/cars&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.192570" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.193293" 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-04-25T23:56:52.193019" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.193739" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.193483" elapsed="0.000299"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.194573" 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-04-25T23:56:52.194382" elapsed="0.000217"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:56:52.194943" 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-04-25T23:56:52.194770" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.195114" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.195719" 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-04-25T23:56:52.195460" elapsed="0.000303"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:56:52.195805" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.195960" 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-04-25T23:56:52.193981" elapsed="0.002004"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:52.200916" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.198319" elapsed="0.004272">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.196054" elapsed="0.006635">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.202874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.202725" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.196036" elapsed="0.006927">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.203333" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.203501" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.203464" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.203447" 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-04-25T23:56:52.203718" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.203786" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.191181" elapsed="0.012707">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.203969" 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-04-25T23:56:52.038754" elapsed="0.165307">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:52.204349" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.204174" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.204157" elapsed="0.000280"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.204470" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}cars</arg>
<arg>${mapping}</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-04-25T23:56:52.034234" elapsed="0.170329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to create a list of cars in the sample test data label and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:56:51.969863" elapsed="0.234862">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t21" name="Check_Car_List_Created" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:52.208077" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.207819" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.209333" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.209224" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.209205" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.214442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.214336" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.214319" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.215613" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.215204" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.216110" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.215814" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.216181" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.216334" 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-04-25T23:56:52.214817" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.221806" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.221698" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.221678" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.223080" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.222974" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.222956" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.223641" 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-04-25T23:56:52.223285" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.224085" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.223840" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.224957" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.224668" elapsed="0.001225">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.226070" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.226120" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.224268" elapsed="0.001880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.227031" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.226754" elapsed="0.001397">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.228336" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.228380" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.226339" elapsed="0.002064"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.229327" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.228713" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.228478" elapsed="0.001020">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.228459" elapsed="0.001234">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.229857" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.230082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.229943" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.229925" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.230210" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.233376" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:56:52.233599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.232576" elapsed="0.001139"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.234616" elapsed="0.000063"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.235607" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.231069" elapsed="0.004735"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.230462" elapsed="0.005455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.222645" elapsed="0.013358">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</status>
</kw>
<msg time="2026-04-25T23:56:52.236103" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.236148" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Car_List_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.222022" elapsed="0.014192"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.236422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.236312" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.236288" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.237365" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.237260" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.237242" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.237709" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.237811" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.237577" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.238240" level="INFO">{1: 75}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.237985" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.238703" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.238432" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.239263" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:56:52.239842" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.239890" 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-04-25T23:56:52.238910" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.240729" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.242823" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.242382" elapsed="0.000974">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.241137" elapsed="0.002295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.244983" elapsed="0.000356"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.243748" elapsed="0.001653"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.240213" elapsed="0.005288"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.239989" elapsed="0.005562"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.239970" elapsed="0.005606"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.246519" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.246116" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.246593" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:56:52.246775" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.245794" elapsed="0.001005"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.246955" elapsed="0.000406"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.247641" level="INFO">index=76
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.247531" elapsed="0.000347"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.248023" elapsed="0.002435"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.250903" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.251908" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.250618" elapsed="0.001662">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.262282" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:56:52.262668" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.260990" elapsed="0.001770"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.263086" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.263346" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.253150" elapsed="0.010335"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.252586" elapsed="0.010948"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.236920" elapsed="0.026696">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.263963" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.264036" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.221345" elapsed="0.042795">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.264244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.264287" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.216772" elapsed="0.047538"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.264680" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.264386" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.264368" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.216618" elapsed="0.048165"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.216445" elapsed="0.048367"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.213949" elapsed="0.050916"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.208921" elapsed="0.055999"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.208486" elapsed="0.056479"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.205604" elapsed="0.059413"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.266050" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.265431" 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-04-25T23:56:52.273519" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.273270" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.273975" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.273732" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:52.278712" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.276303" elapsed="0.004013">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.274086" elapsed="0.006343">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.280632" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.280465" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.274067" elapsed="0.006674">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.281108" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.281242" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.281201" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.281184" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.281444" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.281513" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.268634" elapsed="0.012979">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.281699" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.266293" elapsed="0.015499">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.281845" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.265164" elapsed="0.016770">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;KEEP&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282092" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282287" elapsed="0.000024"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282459" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282619" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282809" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.282970" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.283129" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.283289" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.283449" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.283609" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.283787" elapsed="0.000020"/>
</kw>
<doc>Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.205047" elapsed="0.078889">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t22" name="Add_Device_Data_Item_1_Via_XML_Post" line="169">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:52.287331" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.287075" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.288578" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.288468" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.288438" elapsed="0.000227"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.293707" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.293585" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.293567" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.294761" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.294365" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.295240" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.294944" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.295310" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.295463" 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-04-25T23:56:52.293995" 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-04-25T23:56:52.300957" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.300849" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.300830" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.302230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.302122" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.302104" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.302807" 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-04-25T23:56:52.302439" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.303239" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.302990" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.304080" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.303820" elapsed="0.001135">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.305131" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.305177" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.303421" elapsed="0.001779"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.306046" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.305775" elapsed="0.001299">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.307247" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.307293" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.305365" elapsed="0.001951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.308385" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.307605" elapsed="0.000861">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.307390" elapsed="0.001171">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.307371" elapsed="0.001226">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.308776" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.309037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.308863" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.308846" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.309169" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.312220" elapsed="0.000192"/>
</kw>
<msg time="2026-04-25T23:56:52.312482" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.311506" elapsed="0.001076"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.313529" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.314480" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.310028" elapsed="0.004565"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.309424" elapsed="0.005381"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.301820" elapsed="0.013069">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</status>
</kw>
<msg time="2026-04-25T23:56:52.314991" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.315035" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_1_Via_XML_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.301174" elapsed="0.013885"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.315244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.315135" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.315116" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.316110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.316005" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.315987" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.316497" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.316600" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.316371" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.317072" level="INFO">{1: 76}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.316816" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.317506" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.317264" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.318084" elapsed="0.000316"/>
</kw>
<msg time="2026-04-25T23:56:52.318498" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.318544" 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-04-25T23:56:52.317729" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.319519" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.321787" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.321338" elapsed="0.000981">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.320036" elapsed="0.002359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.323962" elapsed="0.000401"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.322629" elapsed="0.001800"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.319021" elapsed="0.005509"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.318642" elapsed="0.005940"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.318623" elapsed="0.006016"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.325594" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.325189" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.325698" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:56:52.325852" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.324865" 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-04-25T23:56:52.326027" elapsed="0.000404"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.328189" level="INFO">index=77
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.326597" elapsed="0.001749"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.328497" elapsed="0.002362"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.331318" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.332333" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.331022" elapsed="0.001715">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.343182" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:56:52.343554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.341902" elapsed="0.001740"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.343987" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.344255" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.333517" elapsed="0.010877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.333010" elapsed="0.011432"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.315715" elapsed="0.028807">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.344879" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.344952" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.300488" elapsed="0.044566">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.345156" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.345198" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.295864" elapsed="0.049357"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.345541" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.345295" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.345278" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.295725" elapsed="0.049913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.295539" elapsed="0.050343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.293226" elapsed="0.052711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.288171" elapsed="0.057819"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.287749" elapsed="0.058284"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.284939" elapsed="0.061181"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.346721" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:52.346283" elapsed="0.000464"/>
</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-04-25T23:56:52.380687" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.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-04-25T23:56:52.380292" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.381425" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.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-04-25T23:56:52.381206" elapsed="0.000282">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.381581" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.380876" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.382186" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.381785" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.382524" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.382681" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:52.382390" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.383107" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.382862" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.384153" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.383896" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.384613" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.384354" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.385305" 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-04-25T23:56:52.385005" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.386079" 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-04-25T23:56:52.385840" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.386155" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:52.386306" 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-04-25T23:56:52.385511" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.386478" elapsed="0.000251"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:52.384874" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.387310" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:52.387012" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.388213" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.387970" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.388290" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.388440" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:52.387518" elapsed="0.000946"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.388612" elapsed="0.000240"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:52.386882" elapsed="0.002046"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.384704" elapsed="0.004260"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.389006" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:52.389164" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:52.383541" elapsed="0.005649"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.383230" elapsed="0.005996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.389396" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.389250" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.383207" elapsed="0.006263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.390189" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:56:52.389609" elapsed="0.000609"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.390266" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.379665" elapsed="0.010725"/>
</kw>
<msg time="2026-04-25T23:56:52.390442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.366859" elapsed="0.023630"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.403075" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.415603" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.428214" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.428405" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.428574" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.428947" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.428806" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.428792" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.429161" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.429331" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.429495" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.428764" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.428660" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.429772" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.429849" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:52.429966" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:56:52.362575" elapsed="0.067416"/>
</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-04-25T23:56:52.454857" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.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-04-25T23:56:52.454465" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.455603" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.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-04-25T23:56:52.455396" elapsed="0.000290">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.455779" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.455045" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.456346" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/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-04-25T23:56:52.455963" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.456678" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.456804" level="INFO">${template} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:52.456531" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.457226" level="INFO">&lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;category&gt;microcar&lt;/category&gt;
&lt;/car-entry&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.456984" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:56:52.457627" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.457340" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.458165" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.457871" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.457726" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.457321" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.458845" level="INFO">${final_text} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:56:52.458394" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.458924" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.453855" elapsed="0.005194"/>
</kw>
<msg time="2026-04-25T23:56:52.459103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.441031" elapsed="0.018153"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.471955" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.484275" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.496751" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.496948" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.497122" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.497479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.497338" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.497324" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.497710" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.497878" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.498041" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.497297" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.497195" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.498261" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.498336" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:52.498453" level="INFO">${data} = &lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;categ...</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-04-25T23:56:52.440137" elapsed="0.058345"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.499747" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.499497" elapsed="0.000314">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item1/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.499903" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.499155" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.500287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.500036" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.500837" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.500528" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.500368" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.500016" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.503266" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.501073" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:56:52.503345" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.503498" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item1/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:56:52.498825" elapsed="0.004697"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.505063" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.504817" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.505505" level="INFO">&lt;car-entry xmlns="urn:opendaylight:params:xml:ns:yang:controller:config:sal-clustering-it:car"&gt;
  &lt;id&gt;SMALL&lt;/id&gt;
  &lt;model&gt;Isetta&lt;/model&gt;
  &lt;manufacturer&gt;BMW&lt;/manufacturer&gt;
  &lt;year&gt;1953&lt;/year&gt;
  &lt;category&gt;microcar&lt;/category&gt;
&lt;/car-entry&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.505267" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.505963" 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-04-25T23:56:52.505718" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.506394" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.506156" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.507258" 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-04-25T23:56:52.507058" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:56:52.507607" 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-04-25T23:56:52.507435" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.507807" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.508408" 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-04-25T23:56:52.508158" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:56:52.508494" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.508666" 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-04-25T23:56:52.506635" 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-04-25T23:56:52.513352" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.511019" elapsed="0.003991">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.508765" elapsed="0.006329">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.515284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.515127" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.508747" elapsed="0.006626">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.515755" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.515928" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.515891" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.515873" 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-04-25T23:56:52.516133" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.516200" 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>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.503866" elapsed="0.012442">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.516389" 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-04-25T23:56:52.351521" elapsed="0.164961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:52.516784" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.516594" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.516578" elapsed="0.000298"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.516907" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}item1</arg>
<arg>${mapping}</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-04-25T23:56:52.346999" elapsed="0.170001">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a request to create a data item in the test list and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.284302" elapsed="0.232838">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t23" name="Check_Item1_Is_Created" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:52.520432" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.520174" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.521685" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.521562" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.521543" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.526814" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.526708" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.526689" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.527884" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.527488" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.528360" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.528067" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.528431" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.528584" 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-04-25T23:56:52.527111" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.534178" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.534067" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.534046" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.535458" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.535354" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.535336" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.536050" level="INFO">${karaf_connection_index} = 77</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.535692" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.536477" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.536232" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.537326" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.537060" elapsed="0.001131">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.538368" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.538413" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.536676" elapsed="0.001760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.539296" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.539019" elapsed="0.001292">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.540485" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.540531" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.538601" elapsed="0.001953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.541459" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.540872" elapsed="0.000665">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.540629" elapsed="0.000999">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.540610" elapsed="0.001221">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.541993" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.542219" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.542080" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.542064" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.542346" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.545419" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:56:52.545642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.544775" 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-04-25T23:56:52.546644" elapsed="0.000052"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.547593" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.543215" elapsed="0.004529"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.542600" elapsed="0.005260"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.535052" elapsed="0.012893">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:56:52.548088" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.548132" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item1_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.534395" elapsed="0.013760"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.548340" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.548233" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.548214" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.549275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.549172" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.549154" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.549602" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.549719" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.549489" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.550151" level="INFO">{1: 77}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.549897" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.550726" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.550343" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.551288" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:56:52.551733" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.551780" level="INFO">${old_connection_index} = 77</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.550937" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.552598" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.554978" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.554509" elapsed="0.001004">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.553201" elapsed="0.002390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.557120" elapsed="0.000359"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.555856" elapsed="0.001687"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.552098" elapsed="0.005547"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.551879" elapsed="0.005832"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.551861" elapsed="0.005876"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.558678" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.558256" elapsed="0.000457"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.558763" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:52.558916" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.557937" elapsed="0.001003"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.559091" elapsed="0.000400"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.559797" level="INFO">index=78
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.559685" 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-04-25T23:56:52.560067" elapsed="0.002572"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.563089" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.564348" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.562826" elapsed="0.002013">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.575110" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:56:52.575489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.573592" 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-04-25T23:56:52.575916" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.576174" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.565620" elapsed="0.010693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.565113" elapsed="0.011249"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.548881" elapsed="0.027563">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.576802" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.576877" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.533592" elapsed="0.043390">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.577087" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.577130" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.529034" elapsed="0.048118"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.577475" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.577228" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.577210" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.528895" elapsed="0.048679"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.528722" elapsed="0.048880"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.526333" elapsed="0.051363"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.521275" elapsed="0.056480"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.520858" elapsed="0.056942"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.518030" elapsed="0.059821"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.578872" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.578268" elapsed="0.000633"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.586059" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.585814" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.586495" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.586253" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:52.591360" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.588975" elapsed="0.003998">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.586633" elapsed="0.006455">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.593276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.593124" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.586611" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.593750" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.593884" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.593846" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.593829" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.594083" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.594152" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.581445" elapsed="0.012813">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.594327" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.579111" elapsed="0.015308">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.594489" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.577996" elapsed="0.016584">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.594760" elapsed="0.000022"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.594927" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595087" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595247" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595406" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595565" elapsed="0.000020"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595739" elapsed="0.000021"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.595900" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.596058" elapsed="0.000019"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.596234" elapsed="0.000024"/>
</kw>
<doc>Get the device data as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.517430" elapsed="0.079018">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t24" name="Add_Device_Data_Item_2_Via_JSON_Post" 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-04-25T23:56:52.599763" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.599490" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.601004" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.600897" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.600878" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.606110" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.606004" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.605985" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.607181" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.606802" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.607672" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.607365" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.607744" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:52.607899" 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-04-25T23:56:52.606411" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.613313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.613207" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.613188" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.614575" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.614469" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.614451" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.615164" level="INFO">${karaf_connection_index} = 78</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.614811" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.615589" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.615345" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.616433" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.616171" elapsed="0.001117">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.617464" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.617509" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.615791" elapsed="0.001741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.618375" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.618099" elapsed="0.001281">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.619553" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.619599" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.617711" elapsed="0.001911"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.620684" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.619939" elapsed="0.000826">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.619721" elapsed="0.001136">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.619702" elapsed="0.001221">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.621086" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.621312" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.621173" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.621156" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.621441" 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-04-25T23:56:52.624424" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:56:52.624645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.623791" elapsed="0.000965"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.625663" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.626590" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.622302" elapsed="0.004426"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.621708" elapsed="0.005134"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.614154" elapsed="0.012773">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</status>
</kw>
<msg time="2026-04-25T23:56:52.627028" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.627071" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Add_Device_Data_Item_2_Via_JSON_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.613526" elapsed="0.013569"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.627277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.627171" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.627152" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.628228" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.628124" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.628106" elapsed="0.000186"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.628551" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.628667" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.628439" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.629101" level="INFO">{1: 78}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.628847" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.629530" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.629292" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.630093" elapsed="0.000322"/>
</kw>
<msg time="2026-04-25T23:56:52.630513" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.630559" level="INFO">${old_connection_index} = 78</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.629740" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.631424" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.633623" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.633209" elapsed="0.000971">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.631921" elapsed="0.002361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.635901" elapsed="0.000350"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.634523" elapsed="0.001790"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.630893" elapsed="0.005561"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.630676" elapsed="0.005831"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.630638" elapsed="0.005894"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.637474" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.637069" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.637549" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.637717" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.636749" elapsed="0.000993"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.637894" elapsed="0.000403"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.638749" level="INFO">index=79
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.638465" elapsed="0.000414"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.639024" elapsed="0.002222"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.641746" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.642663" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.641411" elapsed="0.001620">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.653328" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:56:52.653724" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.652029" 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-04-25T23:56:52.654154" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.654416" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.643968" elapsed="0.010585"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.643298" elapsed="0.011302"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.627832" elapsed="0.026867">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.655030" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.655101" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.612870" elapsed="0.042334">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.655307" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.655349" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.608285" elapsed="0.047087"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.656095" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.655446" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.655429" elapsed="0.000748"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.608146" elapsed="0.048054"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.607976" elapsed="0.048253"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.605627" elapsed="0.050657"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.600596" elapsed="0.055778"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.600174" elapsed="0.056246"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.597337" elapsed="0.059134"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.657071" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:52.656634" elapsed="0.000464"/>
</kw>
<kw name="Post_As_Json_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.703570" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.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-04-25T23:56:52.703162" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.704342" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.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-04-25T23:56:52.704102" elapsed="0.000308">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.704502" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.703773" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.705083" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.704703" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.705406" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.705539" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:52.705273" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.705993" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/car:cars
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.705744" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.706983" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.706726" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.707440" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.707183" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.708129" 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-04-25T23:56:52.707834" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.708905" 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-04-25T23:56:52.708666" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.708980" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.709129" 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-04-25T23:56:52.708341" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.709301" elapsed="0.000223"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:52.707702" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.710137" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:52.709842" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:52.710909" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.710675" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:52.710983" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.711131" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:52.710349" elapsed="0.000838"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.711339" elapsed="0.000221"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:52.709701" elapsed="0.001900"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.707513" elapsed="0.004122"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:52.711693" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:52.711850" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:52.706391" elapsed="0.005484"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.706104" elapsed="0.005802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.712076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.711930" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.706085" elapsed="0.006066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.712861" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:56:52.712290" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.712937" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.702527" elapsed="0.010531"/>
</kw>
<msg time="2026-04-25T23:56:52.713110" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.689711" elapsed="0.023445"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.725815" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.738244" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.750805" 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-04-25T23:56:52.750997" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.751166" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.751524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.751384" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.751370" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.751754" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.751920" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.752119" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.751342" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.751240" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.752338" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.752411" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:52.752527" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:56:52.684053" elapsed="0.068499"/>
</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-04-25T23:56:52.777322" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/post_data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.776939" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.778066" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/post_data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.777862" elapsed="0.000267">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2.titanium/post_data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.778221" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.777514" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.778802" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/post_data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.778404" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.779119" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/post_data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/post_data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:52.779241" level="INFO">${template} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:56:52.778985" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.779674" level="INFO">{
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.779418" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:56:52.780074" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.779787" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.780596" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.780304" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.780155" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.779768" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.781283" level="INFO">${final_text} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:56:52.780837" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:52.781359" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:52.776316" elapsed="0.005167"/>
</kw>
<msg time="2026-04-25T23:56:52.781566" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.763713" elapsed="0.017902"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.794372" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.806816" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.819284" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.819477" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.819663" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.820028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.819883" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.819869" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.820243" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.820408" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.820570" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:52.819842" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.819740" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.820807" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.820881" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:52.821011" level="INFO">${data} = {
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</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-04-25T23:56:52.762858" elapsed="0.058181"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:52.822287" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.822041" elapsed="0.000310">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/item2/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:52.822443" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:52.821704" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.822838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.822573" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.823374" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.823080" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.822919" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.822553" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.825811" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.823608" elapsed="0.002230"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:56:52.825890" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.826043" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/item2/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:56:52.821367" elapsed="0.004700"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.827582" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.827335" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.828036" level="INFO">{
  "car:car-entry": {
    "car:id":"TOYOTA",
    "car:model":"Camry",
    "car:manufacturer":"Toyota",
    "car:year":"1982",
    "car:category":"sedan"
  }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.827797" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.828472" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.828230" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.828922" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.828681" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.829778" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:56:52.829571" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:56:52.830122" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:56:52.829954" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.830298" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.830894" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.830635" elapsed="0.000303"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:56:52.830980" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.831132" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.829175" elapsed="0.001981"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:52.836027" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.833484" elapsed="0.004186">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.831226" elapsed="0.006529">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.837938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.837789" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.831208" elapsed="0.006817">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.838387" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.838554" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.838518" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.838500" 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-04-25T23:56:52.838774" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.838841" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.826388" elapsed="0.012555">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.839024" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.673094" elapsed="0.166021">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.839444" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.839246" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.839226" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.839565" elapsed="0.000014"/>
</return>
<arg>${directory_with_template_folders}${/}item2</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.668810" elapsed="0.170863">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a JSON request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.596763" elapsed="0.243052">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/car:cars (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t25" name="Check_Item2_Is_Created" line="193">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:52.843096" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.842840" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.844333" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.844224" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.844206" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.849429" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.849324" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.849306" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.850514" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.850100" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.851008" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.850713" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.851079" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.851253" 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-04-25T23:56:52.849728" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.856910" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.856794" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.856773" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.858182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.858077" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.858059" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.858762" level="INFO">${karaf_connection_index} = 79</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.858392" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.859189" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.858943" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.860031" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.859769" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.861086" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.861132" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.859371" elapsed="0.001785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.862034" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.861760" elapsed="0.001339">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.863299" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.863355" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.861355" elapsed="0.002026"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.864283" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.863689" elapsed="0.000673">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.863456" elapsed="0.000999">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.863437" elapsed="0.001195">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.864831" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.865065" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.864925" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.864908" elapsed="0.000254"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.865196" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.868227" elapsed="0.000150"/>
</kw>
<msg time="2026-04-25T23:56:52.868447" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.867503" elapsed="0.001038"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.869489" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.870477" 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-04-25T23:56:52.866043" elapsed="0.004552"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.865449" elapsed="0.005364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.857776" elapsed="0.013123">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</status>
</kw>
<msg time="2026-04-25T23:56:52.871034" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.871078" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Item2_Is_Created"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.857127" elapsed="0.013975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.871287" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.871179" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.871160" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.872149" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.872044" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.872026" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.872478" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.872579" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.872362" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.873046" level="INFO">{1: 79}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.872783" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.873479" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.873239" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.874044" elapsed="0.000314"/>
</kw>
<msg time="2026-04-25T23:56:52.874457" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.874502" level="INFO">${old_connection_index} = 79</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.873691" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.875441" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.877543" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.877127" elapsed="0.000954">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.875854" elapsed="0.002304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.879759" elapsed="0.000351"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.878389" elapsed="0.001783"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.874943" elapsed="0.005335"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.874600" elapsed="0.005728"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.874581" elapsed="0.005771"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.881312" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.880911" elapsed="0.000427"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.881386" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.881537" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.880552" elapsed="0.001009"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.881728" elapsed="0.000399"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.882401" level="INFO">index=80
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.882292" 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-04-25T23:56:52.882695" elapsed="0.002407"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.885548" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.886516" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.885262" elapsed="0.001779">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.897133" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:56:52.897509" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.895812" elapsed="0.001787"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.898117" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.898374" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.887831" elapsed="0.010681"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.887311" elapsed="0.011249"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.871752" elapsed="0.026892">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.898993" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.899065" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.856304" elapsed="0.042865">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.899278" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.899321" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.851729" elapsed="0.047615"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.899681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.899419" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.899401" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.851571" elapsed="0.048210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.851399" elapsed="0.048411"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.848955" elapsed="0.050909"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.843939" elapsed="0.055980"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.843508" elapsed="0.056455"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.840687" elapsed="0.059327"/>
</kw>
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.900840" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:52.900424" elapsed="0.000443"/>
</kw>
<kw name="Get_As_Xml_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.908395" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.908147" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.908880" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.908615" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:52.913579" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.911203" elapsed="0.004022">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.908990" elapsed="0.006348">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.915527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.915375" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.908972" elapsed="0.006643">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.915999" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.916130" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.916093" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.916077" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.916330" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.916412" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.903702" elapsed="0.012812">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.916584" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.901075" elapsed="0.015622">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.916753" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.900158" elapsed="0.016686">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;SMALL&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917003" elapsed="0.000021"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Isetta&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917168" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;BMW&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917328" elapsed="0.000019"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1953&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917487" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;microcar&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917646" elapsed="0.000035"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;id&gt;TOYOTA&lt;/id&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917824" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;model&gt;Camry&lt;/model&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.917985" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;manufacturer&gt;Toyota&lt;/manufacturer&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.918144" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;year&gt;1982&lt;/year&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.918310" elapsed="0.000020"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>&lt;category&gt;sedan&lt;/category&gt;</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.918470" elapsed="0.000020"/>
</kw>
<doc>Get the device data as XML and make sure it matches the content posted as JSON in the previous case.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.840109" elapsed="0.078507">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t26" name="Delete_Device_Data" line="207">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:52.921933" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:52.921672" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.923174" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.923065" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.923046" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.928364" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.928247" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.928228" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.929426" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:52.929048" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.929923" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:52.929611" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:52.929994" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.930149" 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-04-25T23:56:52.928674" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.935594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.935486" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.935467" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.936909" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.936802" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.936784" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.937474" level="INFO">${karaf_connection_index} = 80</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.937117" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.937917" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.937671" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.938760" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.938482" elapsed="0.001113">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.939788" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:52.939833" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.938100" elapsed="0.001756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.940708" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.940419" elapsed="0.001290">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:52.941884" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:52.941930" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.940020" elapsed="0.001933"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.942989" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_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-04-25T23:56:52.942242" elapsed="0.000828">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_Data"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:52.942027" elapsed="0.001135">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_Data"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:52.942008" elapsed="0.001189">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_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-04-25T23:56:52.943357" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.943582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.943443" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:52.943426" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.943761" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.946803" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:56:52.947026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.946111" elapsed="0.001010"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.948028" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.948976" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.944623" elapsed="0.004467"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.944016" 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="FAIL" start="2026-04-25T23:56:52.936470" elapsed="0.012819">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_Data"</status>
</kw>
<msg time="2026-04-25T23:56:52.949391" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.949435" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Delete_Device_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-04-25T23:56:52.935830" elapsed="0.013628"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.949640" elapsed="0.000124"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.949533" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.949514" elapsed="0.000302"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.950595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:52.950492" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.950475" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.950938" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.951041" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:52.950826" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.951469" level="INFO">{1: 80}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.951215" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.951917" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:52.951674" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.952486" elapsed="0.000335"/>
</kw>
<msg time="2026-04-25T23:56:52.952918" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:52.952964" level="INFO">${old_connection_index} = 80</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.952114" elapsed="0.000873"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.953895" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.956074" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.955639" elapsed="0.000982">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.954328" elapsed="0.002388"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.958386" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.956966" elapsed="0.001846"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:52.953283" elapsed="0.005628"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:52.953062" elapsed="0.005901"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.953043" elapsed="0.005944"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:52.959977" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.959551" elapsed="0.000453"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:52.960052" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:52.960216" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.959185" elapsed="0.001056"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.960396" elapsed="0.000416"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.961248" level="INFO">index=81
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:52.960980" elapsed="0.000397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:52.961524" elapsed="0.002242"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:52.964197" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:52.965085" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.963926" elapsed="0.001526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:52.975855" elapsed="0.000333"/>
</kw>
<msg time="2026-04-25T23:56:52.976247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:52.974523" elapsed="0.001812"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.976676" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.976938" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:52.966370" elapsed="0.010707"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:52.965865" elapsed="0.011260"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.950200" elapsed="0.027005">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.977532" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:52.977603" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.935150" elapsed="0.042772">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:52.978030" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:52.978074" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.930533" elapsed="0.047563"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:52.978425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:52.978173" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:52.978155" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:52.930396" elapsed="0.048129"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:52.930226" elapsed="0.048327"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:52.927882" elapsed="0.050723"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:52.922777" elapsed="0.055898"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:52.922345" elapsed="0.056375"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:52.919499" elapsed="0.059317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:52.979405" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:56:52.978980" elapsed="0.000451"/>
</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-04-25T23:56:53.022085" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:56:53.021693" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:56:53.022843" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:56:53.022614" elapsed="0.000291">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:56:53.022998" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:56:53.022279" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.023564" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-04-25T23:56:53.023183" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:56:53.023950" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/datamod1/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:56:53.024085" 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-04-25T23:56:53.023805" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.024506" 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-04-25T23:56:53.024264" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.025547" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.025287" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.026026" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.025764" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.026707" 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-04-25T23:56:53.026399" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:53.027442" 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-04-25T23:56:53.027229" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:53.027518" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:53.027683" 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-04-25T23:56:53.026916" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.027883" elapsed="0.000225"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:56:53.026268" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.028729" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:56:53.028419" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:56:53.029459" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.029250" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:56:53.029533" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:53.029695" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:56:53.028933" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.029868" elapsed="0.000220"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:56:53.028277" elapsed="0.001853"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:56:53.026100" elapsed="0.004108"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:56:53.030262" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:56:53.030440" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:56:53.024924" elapsed="0.005540"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:53.024617" elapsed="0.005879"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.030680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.030520" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.024597" elapsed="0.006161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.031450" level="INFO">${final_text} = /restconf/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-04-25T23:56:53.030897" elapsed="0.000580"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:56:53.031526" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:56:53.021069" elapsed="0.010592"/>
</kw>
<msg time="2026-04-25T23:56:53.031731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.008223" elapsed="0.023557"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.045586" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.058035" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD/../../../variables/netconf/CRUD/datamod1/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.070594" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.070807" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.070980" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.071340" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.071199" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.071184" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.071569" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.071761" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.071926" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:56:53.071157" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.071055" elapsed="0.000951"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.072186" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.072263" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:56:53.072380" level="INFO">${uri} = /restconf/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-04-25T23:56:53.003897" elapsed="0.068508"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.073542" level="INFO">/restconf/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-04-25T23:56:53.073272" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:53.078030" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:53.075732" elapsed="0.004000">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.073671" elapsed="0.006139">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:53.079990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.079843" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.073637" elapsed="0.006437">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:56:53.080432" elapsed="0.000025"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.080504" elapsed="0.000015"/>
</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-04-25T23:56:53.072679" elapsed="0.007926">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.080685" elapsed="0.000016"/>
</return>
<arg>${directory_with_template_folders}${/}datamod1</arg>
<arg>${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-25T23:56:52.979666" elapsed="0.101114">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<arg>${directory_with_template_folders}${/}item1</arg>
<arg>${mapping}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.081000" elapsed="0.000024"/>
</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-04-25T23:56:52.918949" elapsed="0.162204">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/test:cont (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t27" name="Check_Device_Data_Is_Deleted" line="213">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:53.084530" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:53.084260" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.085847" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.085739" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.085720" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.091019" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.090914" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.090896" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.092091" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:53.091712" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.092573" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:53.092280" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:53.092643" elapsed="0.000045"/>
</return>
<msg time="2026-04-25T23:56:53.092816" 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-04-25T23:56:53.091303" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.098229" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.098118" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.098099" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.099521" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.099415" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.099396" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.100127" 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-04-25T23:56:53.099757" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.100556" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.100311" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.101406" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.101139" elapsed="0.001268">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.102585" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:53.102631" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.100756" elapsed="0.001913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.103513" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.103223" elapsed="0.001299">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.104722" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:53.104768" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.102836" elapsed="0.001955"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.105684" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.105080" elapsed="0.000685">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.104866" elapsed="0.000991">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.104847" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.106049" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.106271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.106134" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.106117" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.106396" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.109450" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:56:53.109691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.108806" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.110702" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.111778" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.107300" elapsed="0.004594"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.106704" elapsed="0.005304"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.099089" elapsed="0.013003">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</status>
</kw>
<msg time="2026-04-25T23:56:53.112194" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.112238" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Data_Is_Deleted"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.098444" elapsed="0.013818"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.112444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.112338" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.112319" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.113309" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.113201" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.113183" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.113638" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.113756" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.113522" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.114184" level="INFO">{1: 81}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.113931" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.114621" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.114380" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.115190" elapsed="0.000326"/>
</kw>
<msg time="2026-04-25T23:56:53.115615" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:53.115705" level="INFO">${old_connection_index} = 81</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.114836" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.116524" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.118614" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.118191" elapsed="0.001163">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.116933" elapsed="0.002504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.121121" elapsed="0.000361"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.119871" elapsed="0.001675"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:53.116023" elapsed="0.005642"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:53.115806" elapsed="0.005914"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.115788" elapsed="0.005958"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.122689" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.122267" elapsed="0.000451"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:53.122810" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:56:53.122966" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.121948" elapsed="0.001043"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.123143" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.123892" level="INFO">index=82
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.123780" elapsed="0.000240"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.124166" elapsed="0.002212"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.126814" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:53.127795" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.126538" elapsed="0.001628">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.138173" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:56:53.138548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.136879" elapsed="0.001758"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.139168" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.139434" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.128954" elapsed="0.010660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.128433" elapsed="0.011246"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.112909" elapsed="0.026855">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.140091" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.140164" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.097782" elapsed="0.042485">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:53.140370" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.140413" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.093198" elapsed="0.047238"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.140776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.140511" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.140494" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:53.093060" elapsed="0.047817"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:53.092893" elapsed="0.048012"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:53.090530" elapsed="0.050427"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:53.085432" elapsed="0.055579"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.085006" elapsed="0.056049"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:53.081972" elapsed="0.059135"/>
</kw>
<kw name="Regexp Escape" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.141583" level="INFO">${escaped} = urn:ietf:params:xml:ns:netconf:base:1\.0</msg>
<var>${escaped}</var>
<arg>${ODL_NETCONF_NAMESPACE}</arg>
<doc>Returns each argument escaped for use as a regular expression.</doc>
<status status="PASS" start="2026-04-25T23:56:53.141262" elapsed="0.000381"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.143022" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${device_name}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:56:53.142556" 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-04-25T23:56:53.150731" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.150439" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.151191" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.150929" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:53.155632" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.153357" elapsed="0.003900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.151303" elapsed="0.006035">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.157518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.157372" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.151285" elapsed="0.006320">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.157995" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.158125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.158089" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.158073" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.158328" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.158395" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.146023" elapsed="0.012475">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.158567" elapsed="0.000015"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.143277" elapsed="0.015402">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.158737" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.142297" elapsed="0.016532">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.159063" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.158901" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.159329" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.159182" elapsed="0.000202"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.159541" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.159407" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.158885" elapsed="0.000730"/>
</if>
<arg>&lt;data xmlns\="${escaped}"(\/&gt;|&gt;&lt;\/data&gt;)</arg>
<arg>${True}</arg>
<status status="FAIL" start="2026-04-25T23:56:53.141869" elapsed="0.017842">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.081452" elapsed="0.078397">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s4-s2-t28" name="Deconfigure_Device_From_Netconf" line="218">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:53.163151" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:53.162880" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.164402" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.164294" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.164275" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.169532" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.169425" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.169407" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.170594" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:53.170210" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.171108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:53.170797" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:53.171179" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:53.171334" 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-04-25T23:56:53.169837" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.176882" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.176773" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.176754" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.178162" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.178057" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.178039" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.178743" level="INFO">${karaf_connection_index} = 82</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.178371" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.179195" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.178947" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.180041" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.179777" elapsed="0.001205">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.181161" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:53.181209" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.179377" elapsed="0.001857"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.182071" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.181799" elapsed="0.001301">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.183308" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:53.183354" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.181396" elapsed="0.001981"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.184427" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.183684" elapsed="0.000823">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.183451" elapsed="0.001148">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.183432" elapsed="0.001202">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.184812" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.185037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.184899" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.184882" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.185165" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.188143" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:56:53.188365" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.187484" elapsed="0.000975"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.189371" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.190324" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.186008" elapsed="0.004429"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.185417" elapsed="0.005135"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.177756" elapsed="0.012879">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</status>
</kw>
<msg time="2026-04-25T23:56:53.190870" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.190920" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Deconfigure_Device_From_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.177099" elapsed="0.013846"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.191128" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.191022" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.191003" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.191990" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.191886" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.191868" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.192322" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.192423" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.192205" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.192869" level="INFO">{1: 82}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.192597" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.193299" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.193061" 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-04-25T23:56:53.193859" elapsed="0.000313"/>
</kw>
<msg time="2026-04-25T23:56:53.194269" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:53.194314" level="INFO">${old_connection_index} = 82</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.193493" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.195320" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.197433" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.197013" elapsed="0.001036">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.195736" elapsed="0.002390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.199770" elapsed="0.000356"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.198359" elapsed="0.001830"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:53.194805" elapsed="0.005486"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:53.194411" elapsed="0.005931"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.194392" elapsed="0.005976"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.201306" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.200900" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:53.201380" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:53.201529" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.200565" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.201734" elapsed="0.000398"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.202566" level="INFO">index=83
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.202298" elapsed="0.000536"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.202983" elapsed="0.002202"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.205599" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:53.206603" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.205343" elapsed="0.001771">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.217354" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:56:53.217744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.216070" elapsed="0.001761"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.218154" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.218412" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.207903" elapsed="0.010649"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.207384" elapsed="0.011215"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.191572" elapsed="0.027155">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.219058" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.219129" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.176412" elapsed="0.042819">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:53.219334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.219378" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.171737" elapsed="0.047695"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.219996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.219511" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.219493" elapsed="0.000582"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:53.171581" elapsed="0.048517"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:53.171410" elapsed="0.048717"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:53.169063" elapsed="0.051118"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:53.164004" elapsed="0.056232"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.163564" elapsed="0.056717"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:53.160746" elapsed="0.059588"/>
</kw>
<kw name="Remove_Device_From_Netconf" owner="NetconfKeywords">
<kw name="Pop From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.221185" level="FAIL">Dictionary does not contain key 'netconf-test-device'.</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="FAIL" start="2026-04-25T23:56:53.220931" elapsed="0.000321">Dictionary does not contain key 'netconf-test-device'.</status>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:53.221426" elapsed="0.000021"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<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="NOT RUN" start="2026-04-25T23:56:53.229862" elapsed="0.000027"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-25T23:56:53.230105" elapsed="0.000023"/>
</kw>
<arg>${device_name}</arg>
<doc>Tell Netconf to deconfigure the specified device</doc>
<status status="FAIL" start="2026-04-25T23:56:53.220552" elapsed="0.009676">Dictionary does not contain key 'netconf-test-device'.</status>
</kw>
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:56:53.160170" elapsed="0.070186">Dictionary does not contain key 'netconf-test-device'.</status>
</test>
<test id="s1-s4-s2-t29" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="224">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:56:53.235192" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:56:53.234932" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.236431" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.236322" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.236304" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.241377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.241272" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.241254" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.242427" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:56:53.242049" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.242940" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:56:53.242622" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:56:53.243010" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:56:53.243164" 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-04-25T23:56:53.241678" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.248575" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.248469" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.248451" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.249849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.249743" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.249725" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.250474" level="INFO">${karaf_connection_index} = 83</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.250097" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.250931" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.250681" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.251772" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.251499" elapsed="0.001272">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.252948" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:56:53.252993" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.251115" elapsed="0.001902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.253854" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.253566" elapsed="0.001330">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:56:53.255071" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:56:53.255117" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.253181" elapsed="0.001959"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.256046" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.255430" elapsed="0.000695">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.255215" elapsed="0.001006">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.255196" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.256416" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.256643" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.256503" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.256486" elapsed="0.000270"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.256789" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.259860" elapsed="0.000154"/>
</kw>
<msg time="2026-04-25T23:56:53.260085" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.259076" elapsed="0.001104"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.261177" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.262122" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.257609" elapsed="0.004626"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.257043" elapsed="0.005306"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.249415" elapsed="0.013039">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<msg time="2026-04-25T23:56:53.262562" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.262605" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD.CRUD.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.248803" elapsed="0.013826"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.262850" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.262740" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.262720" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.263792" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.263585" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.263568" elapsed="0.000325"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.264159" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.264261" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:56:53.264044" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.264710" level="INFO">{1: 83}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.264437" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.265144" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.264902" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.265714" elapsed="0.000315"/>
</kw>
<msg time="2026-04-25T23:56:53.266128" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:56:53.266175" level="INFO">${old_connection_index} = 83</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.265345" elapsed="0.000852"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.267046" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.269410" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.268855" elapsed="0.001100">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.267440" elapsed="0.002591"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.271522" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.270261" elapsed="0.001697"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:56:53.266501" elapsed="0.005558"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:53.266273" elapsed="0.005837"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.266254" elapsed="0.005881"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:56:53.273063" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.272664" elapsed="0.000426"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:56:53.273139" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:53.273289" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.272332" elapsed="0.000981"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.273463" elapsed="0.000408"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.274144" level="INFO">index=84
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:56:53.274036" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:56:53.274432" elapsed="0.002335"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:56:53.277177" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:56:53.278014" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.276925" elapsed="0.001474">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:56:53.288935" elapsed="0.000400"/>
</kw>
<msg time="2026-04-25T23:56:53.289407" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:56:53.287310" elapsed="0.002186"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.289877" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.290150" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:56:53.279201" elapsed="0.011106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:56:53.278700" elapsed="0.011657"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.263298" elapsed="0.027141">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.290799" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.290874" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.248138" elapsed="0.042840">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:56:53.291082" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:56:53.291124" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.243556" elapsed="0.047592"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.291472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.291224" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.291206" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:56:53.243417" elapsed="0.048154"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:56:53.243243" elapsed="0.048357"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:56:53.240911" elapsed="0.050941"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:56:53.236036" elapsed="0.055876"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:56:53.235602" elapsed="0.056355"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:56:53.232500" elapsed="0.059509"/>
</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-04-25T23:56:53.304953" 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-04-25T23:56:53.302770" elapsed="0.002209"/>
</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-04-25T23:56:53.305305" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:53.305148" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.305032" elapsed="0.000355"/>
</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-04-25T23:56:53.305699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.305448" elapsed="0.000310"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.306514" level="INFO">${uri} = /restconf/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-04-25T23:56:53.306011" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:53.305781" 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-04-25T23:56:53.306786" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.306601" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:53.305431" elapsed="0.001432"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:53.306896" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:56:53.307043" level="INFO">${uri} = /restconf/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-04-25T23:56:53.302300" elapsed="0.004768"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:53.307114" elapsed="0.000025"/>
</return>
<msg time="2026-04-25T23:56:53.307292" level="INFO">${uri} = /restconf/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-04-25T23:56:53.301802" elapsed="0.005515"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.314532" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.314283" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:53.314989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:53.314747" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:53.319435" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:53.317147" elapsed="0.003899">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:53.315099" elapsed="0.006028">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.321309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:53.321160" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:53.315081" elapsed="0.006314">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.321777" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.321908" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:53.321872" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:53.321856" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.322119" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.322189" 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-04-25T23:56:53.309964" elapsed="0.012330">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.322364" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:56:53.307536" elapsed="0.014925">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.322630" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:53.322828" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:53.322891" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:53.294211" elapsed="0.028778">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.323152" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:53.293742" elapsed="0.029517">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:53.332157" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:53.335701" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:53.293183" elapsed="0.042725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:54.356241" 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-04-25T23:56:54.354088" elapsed="0.002184"/>
</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-04-25T23:56:54.356633" elapsed="0.000042"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:54.356473" elapsed="0.000241"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:54.356333" elapsed="0.000411"/>
</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-04-25T23:56:54.357071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:54.356813" 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-04-25T23:56:54.357918" level="INFO">${uri} = /restconf/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-04-25T23:56:54.357409" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:54.357162" 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-04-25T23:56:54.358177" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:54.358009" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:54.356792" elapsed="0.001463"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:54.358289" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:56:54.358442" level="INFO">${uri} = /restconf/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-04-25T23:56:54.353593" elapsed="0.004875"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:54.358514" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:56:54.358672" level="INFO">${uri} = /restconf/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-04-25T23:56:54.353060" elapsed="0.005640"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:54.366098" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:54.365840" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:54.366545" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:54.366299" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:54.371143" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:54.368741" elapsed="0.004040">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:54.366673" elapsed="0.006191">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:54.373047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:54.372897" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:54.366639" elapsed="0.006536">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:54.373540" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:54.373686" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:54.373634" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:54.373618" 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-04-25T23:56:54.373890" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:54.373959" 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-04-25T23:56:54.361344" elapsed="0.012720">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:54.374136" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:54.358924" elapsed="0.015308">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:54.374404" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:54.374568" elapsed="0.000019"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:54.374629" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:54.338895" elapsed="0.035852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:54.374910" elapsed="0.000020"/>
</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="FAIL" start="2026-04-25T23:56:54.337869" elapsed="0.037147">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:54.382121" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:54.385797" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:54.336587" elapsed="0.049333">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:55.408087" 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-04-25T23:56:55.405037" elapsed="0.003097"/>
</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-04-25T23:56:55.408639" elapsed="0.000051"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:55.408422" elapsed="0.000321"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:55.408235" elapsed="0.000672"/>
</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-04-25T23:56:55.409387" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:55.409026" elapsed="0.000442"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:55.410518" level="INFO">${uri} = /restconf/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-04-25T23:56:55.409843" elapsed="0.000713"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:55.409503" elapsed="0.001104"/>
</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-04-25T23:56:55.410890" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:55.410642" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:55.408993" elapsed="0.002005"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:55.411049" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:56:55.411293" level="INFO">${uri} = /restconf/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-04-25T23:56:55.404336" elapsed="0.006994"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:55.411397" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:56:55.411598" level="INFO">${uri} = /restconf/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-04-25T23:56:55.403263" elapsed="0.008369"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:55.420084" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:55.419820" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:55.420529" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:55.420284" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:55.425515" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:55.422710" elapsed="0.004518">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:55.420640" elapsed="0.006679">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.427505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:55.427352" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:55.420622" elapsed="0.006970">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.428000" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:55.428132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:55.428095" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:55.428078" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.428332" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:55.428401" 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-04-25T23:56:55.415447" elapsed="0.013062">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:55.428582" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:55.411981" elapsed="0.016753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.428914" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:55.429081" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:55.429144" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:55.389246" elapsed="0.039999">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.429413" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:55.388200" elapsed="0.041326">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:55.436862" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:55.440399" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:55.386822" elapsed="0.053708">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:56.458829" 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-04-25T23:56:56.456637" elapsed="0.002226"/>
</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-04-25T23:56:56.459228" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:56.459073" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:56.458937" elapsed="0.000381"/>
</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-04-25T23:56:56.459674" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:56.459393" 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-04-25T23:56:56.460469" level="INFO">${uri} = /restconf/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-04-25T23:56:56.459992" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:56.459759" 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-04-25T23:56:56.460738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:56.460558" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:56.459372" elapsed="0.001443"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:56.460855" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:56:56.461025" level="INFO">${uri} = /restconf/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-04-25T23:56:56.456151" elapsed="0.004899"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:56.461096" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:56:56.461238" level="INFO">${uri} = /restconf/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-04-25T23:56:56.455627" elapsed="0.005636"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:56.468800" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:56.468523" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:56.469250" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:56.469003" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:56.474290" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:56.471428" elapsed="0.004584">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:56.469361" elapsed="0.006740">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.476292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:56.476135" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:56.469342" elapsed="0.007038">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.476794" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:56.476927" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:56.476891" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:56.476874" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.477129" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:56.477199" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:56.463929" elapsed="0.013383">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:56.477388" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:56.461483" elapsed="0.016002">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.477673" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:56.477842" elapsed="0.000019"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:56.477903" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:56.444013" elapsed="0.033988">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.478164" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:56.442924" elapsed="0.035347">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:56.485437" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:56.489031" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:56.441424" elapsed="0.047731">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:57.509927" 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-04-25T23:56:57.507787" 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-04-25T23:56:57.510319" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:57.510165" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:57.510032" elapsed="0.000377"/>
</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-04-25T23:56:57.510766" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:57.510482" elapsed="0.000354"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:57.511575" level="INFO">${uri} = /restconf/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-04-25T23:56:57.511093" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:57.510861" 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-04-25T23:56:57.511845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:57.511680" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:57.510463" elapsed="0.001458"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:57.511959" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:56:57.512123" level="INFO">${uri} = /restconf/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-04-25T23:56:57.507257" elapsed="0.004890"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:57.512194" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:56:57.512335" level="INFO">${uri} = /restconf/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-04-25T23:56:57.506744" elapsed="0.005616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:57.519613" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:57.519355" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:57.520071" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:57.519828" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:57.524921" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:57.522231" elapsed="0.004371">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:57.520181" elapsed="0.006522">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.526904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:57.526739" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:57.520162" elapsed="0.006830">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.527363" elapsed="0.000085"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:57.527560" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:57.527522" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:57.527505" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.527780" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:57.527852" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:57.515034" elapsed="0.012935">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:57.528042" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:57.512577" elapsed="0.015560">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.528307" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:57.528477" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:57.528540" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:57.492468" elapsed="0.036171">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.528821" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:57.491374" elapsed="0.037556">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:57.536232" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:57.539784" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:57.489998" elapsed="0.049910">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:58.560035" 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-04-25T23:56:58.557874" elapsed="0.002194"/>
</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-04-25T23:56:58.560433" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:58.560278" elapsed="0.000213"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:58.560142" elapsed="0.000379"/>
</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-04-25T23:56:58.560974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:58.560595" elapsed="0.000437"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:56:58.561880" level="INFO">${uri} = /restconf/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-04-25T23:56:58.561286" elapsed="0.000622"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:58.561058" 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-04-25T23:56:58.562133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:58.561970" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:58.560575" elapsed="0.001634"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:58.562248" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:56:58.562412" level="INFO">${uri} = /restconf/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-04-25T23:56:58.557370" elapsed="0.005067"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:58.562485" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:56:58.562629" level="INFO">${uri} = /restconf/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-04-25T23:56:58.556866" elapsed="0.005801"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:58.570106" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:58.569845" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:58.570546" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:58.570304" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:58.575698" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:58.572753" elapsed="0.004624">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:58.570671" elapsed="0.006794">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.577664" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:58.577499" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:58.570638" elapsed="0.007116">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.578127" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:58.578257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:58.578221" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:58.578204" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.578460" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:58.578528" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:58.565301" elapsed="0.013333">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:58.578729" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:56:58.562889" elapsed="0.015939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.578996" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:58.579200" elapsed="0.000022"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:58.579289" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-04-25T23:56:58.543256" elapsed="0.036139">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.579568" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:58.542194" elapsed="0.037503">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:58.586812" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:58.590340" elapsed="0.000025"/>
</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="FAIL" start="2026-04-25T23:56:58.540830" elapsed="0.049632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:56:59.610820" 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-04-25T23:56:59.608697" elapsed="0.002153"/>
</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-04-25T23:56:59.611195" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:56:59.611042" elapsed="0.000210"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:56:59.610915" 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-04-25T23:56:59.611600" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:59.611348" 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-04-25T23:56:59.612415" level="INFO">${uri} = /restconf/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-04-25T23:56:59.611927" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-25T23:56:59.611695" 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-04-25T23:56:59.612684" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:59.612504" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-25T23:56:59.611329" elapsed="0.001432"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:59.612796" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:56:59.612950" level="INFO">${uri} = /restconf/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-04-25T23:56:59.608198" elapsed="0.004777"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:56:59.613022" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:56:59.613164" level="INFO">${uri} = /restconf/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-04-25T23:56:59.607710" elapsed="0.005478"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:59.620452" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:59.620200" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:56:59.620904" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:56:59.620661" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:56:59.625802" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:56:59.623048" elapsed="0.004416">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:56:59.621012" elapsed="0.006536">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.627800" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:56:59.627582" elapsed="0.000287"/>
</branch>
<status status="FAIL" start="2026-04-25T23:56:59.620994" elapsed="0.006899">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.628271" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:59.628401" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:56:59.628365" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:56:59.628349" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.628600" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:56:59.628687" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:56:59.615885" elapsed="0.012916">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:56:59.628870" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:56:59.613403" elapsed="0.015563">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.629131" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:56:59.629293" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:56:59.629353" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:56:59.593458" elapsed="0.035993">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.629611" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:56:59.592417" elapsed="0.037321">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:56:59.637197" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:56:59.640737" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:56:59.591149" elapsed="0.049712">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:00.658461" 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-04-25T23:57:00.656244" elapsed="0.002252"/>
</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-04-25T23:57:00.658887" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:00.658729" elapsed="0.000216"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:00.658573" elapsed="0.000403"/>
</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-04-25T23:57:00.659323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:00.659055" 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-04-25T23:57:00.660126" level="INFO">${uri} = /restconf/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-04-25T23:57:00.659632" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:00.659406" 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-04-25T23:57:00.660378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:00.660214" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:00.659034" elapsed="0.001420"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:00.660500" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:57:00.660683" level="INFO">${uri} = /restconf/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-04-25T23:57:00.655752" elapsed="0.004958"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:00.660758" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:00.660901" level="INFO">${uri} = /restconf/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-04-25T23:57:00.655210" elapsed="0.005716"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:00.668311" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:00.668048" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:00.668776" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:00.668509" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:00.673927" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:00.671034" elapsed="0.004584">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:00.668887" elapsed="0.006832">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.675905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:00.675753" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:00.668868" elapsed="0.007123">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.676366" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:00.676496" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:00.676460" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:00.676443" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.676773" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:00.676844" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:00.663566" elapsed="0.013386">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:00.677024" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:00.661145" elapsed="0.015975">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.677286" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:00.677465" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:00.677528" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:00.644389" elapsed="0.033238">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.677813" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:00.643323" elapsed="0.034599">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:00.684987" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:00.688500" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:00.641877" elapsed="0.046746">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:01.708042" 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-04-25T23:57:01.704913" elapsed="0.003165"/>
</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-04-25T23:57:01.708454" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:01.708295" elapsed="0.000216"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:01.708157" elapsed="0.000408"/>
</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-04-25T23:57:01.708926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:01.708645" 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-04-25T23:57:01.709730" level="INFO">${uri} = /restconf/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-04-25T23:57:01.709243" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:01.709015" 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-04-25T23:57:01.709981" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:01.709819" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:01.708623" elapsed="0.001502"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:01.710166" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:57:01.710341" level="INFO">${uri} = /restconf/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-04-25T23:57:01.704414" elapsed="0.005953"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:01.710414" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:01.710559" level="INFO">${uri} = /restconf/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-04-25T23:57:01.703898" elapsed="0.006686"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:01.718055" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:01.717794" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:01.718511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:01.718252" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:01.723517" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:01.720809" elapsed="0.004407">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:01.718621" elapsed="0.006684">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.725489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:01.725339" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:01.718603" elapsed="0.006973">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.725960" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:01.726090" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:01.726054" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:01.726037" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.726290" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:01.726358" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:01.713312" elapsed="0.013152">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:01.726535" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:01.710818" elapsed="0.015812">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.726814" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:01.726993" elapsed="0.000027"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:01.727063" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:01.692018" elapsed="0.035141">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.727356" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:01.690947" elapsed="0.036519">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:01.736936" elapsed="0.000029"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:01.740496" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:01.689535" elapsed="0.051085">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:02.758816" 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-04-25T23:57:02.756053" elapsed="0.002793"/>
</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-04-25T23:57:02.759186" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:02.759034" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:02.758908" 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-04-25T23:57:02.759587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:02.759339" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:02.760392" level="INFO">${uri} = /restconf/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-04-25T23:57:02.759918" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:02.759684" 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-04-25T23:57:02.760643" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:02.760480" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:02.759320" elapsed="0.001414"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:02.760781" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:57:02.760938" level="INFO">${uri} = /restconf/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-04-25T23:57:02.755394" elapsed="0.005569"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:02.761009" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:02.761152" level="INFO">${uri} = /restconf/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-04-25T23:57:02.754720" elapsed="0.006457"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:02.768536" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:02.768273" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:02.769020" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:02.768770" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:02.773807" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:02.771186" elapsed="0.004315">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:02.769132" elapsed="0.006518">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.775870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:02.775715" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:02.769113" elapsed="0.006845">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.776331" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:02.776462" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:02.776425" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:02.776408" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.776676" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:02.776759" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:02.763805" elapsed="0.013064">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:02.776940" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:02.761394" elapsed="0.015643">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.777207" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:02.777373" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:02.777435" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:57:02.743639" elapsed="0.033894">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.777723" elapsed="0.000030"/>
</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="FAIL" start="2026-04-25T23:57:02.742552" elapsed="0.035305">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:02.785201" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:02.788757" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:57:02.741308" elapsed="0.047574">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:03.808486" 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-04-25T23:57:03.806322" elapsed="0.002198"/>
</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-04-25T23:57:03.808991" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:03.808837" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:03.808693" elapsed="0.000387"/>
</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-04-25T23:57:03.809419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:03.809155" 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-04-25T23:57:03.810224" level="INFO">${uri} = /restconf/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-04-25T23:57:03.809747" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:03.809502" 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-04-25T23:57:03.810475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:03.810311" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:03.809134" elapsed="0.001417"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:03.810591" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:57:03.810784" level="INFO">${uri} = /restconf/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-04-25T23:57:03.805838" elapsed="0.004973"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:03.810858" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:03.811008" level="INFO">${uri} = /restconf/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-04-25T23:57:03.805314" elapsed="0.005718"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:03.818403" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:03.818131" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:03.818874" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:03.818600" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:03.823994" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:03.821049" elapsed="0.004640">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:03.818985" elapsed="0.006799">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.825971" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:03.825819" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:03.818966" elapsed="0.007091">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.826435" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:03.826565" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:03.826529" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:03.826512" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.826793" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:03.826864" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:03.813675" elapsed="0.013299">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:03.827132" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:57:03.811252" elapsed="0.015982">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.827405" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:03.827575" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:03.827637" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-04-25T23:57:03.792266" elapsed="0.035496">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.827925" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:03.791192" elapsed="0.036842">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:03.835420" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:03.838992" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:57:03.789781" elapsed="0.049338">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:57:03.839221" level="FAIL">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:56:53.292613" elapsed="10.546705">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${device_name}</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="FAIL" start="2026-04-25T23:56:53.292212" elapsed="10.547220">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Check that the device is really going to be gone. Fail
if found after one minute. This is an expected behavior as the
delete request is sent to the config subsystem which then triggers
asynchronous destruction of the netconf connector referring to the
device and the device's data. This test makes sure this
asynchronous operation does not take unreasonable amount of time
by making sure that both the netconf connector and the device's
data is gone before reporting success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:56:53.230945" elapsed="10.608652">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:03.840639" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:57:03.840544" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:03.842192" 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-04-25T23:57:03.841881" elapsed="0.000339"/>
</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-04-25T23:57:03.842371" elapsed="0.000336"/>
</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-04-25T23:57:03.841670" elapsed="0.001114"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.176161" level="INFO">[?2004l^C[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-04-25T23:57:03.842948" elapsed="0.333373"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.183378" level="INFO">'testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD.1777161287.167.log' -&gt; '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/testtool--netconf-gate-userfeatures-netty-txt-CRUD-CRUD.1777161287.167.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-04-25T23:57:04.176580" elapsed="0.006859"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-04-25T23:57:03.841400" elapsed="0.342116"/>
</kw>
<arg>NetconfKeywords.Stop_Testtool</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:03.840999" elapsed="0.342567"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-25T23:57:03.840303" elapsed="0.343318"/>
</kw>
<doc>netconf-connector CRUD test suite.

Copyright (c) 2015 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.

FIXME: Replace the BuiltIn.Should_[Not_]Contain instances in the test cases
that check the car list related data with calls to keywords of a Resource
aimed at getting interesting pieces of data from the XML files and checking
them against expected data sets. See MDSAL/northbound.robot suite for
additional information.</doc>
<status status="FAIL" start="2026-04-25T23:54:41.235521" elapsed="142.948157"/>
</suite>
<status status="FAIL" start="2026-04-25T23:52:07.663782" elapsed="296.521150"/>
</suite>
<suite id="s1-s5" name="CRUD-ACTION" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION">
<suite id="s1-s5-s1" name="CRUD-ACTION" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.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-04-25T23:57:04.275482" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:04.271232" elapsed="0.004298"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:57:04.271007" elapsed="0.004589"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.280751" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:04.276701" elapsed="0.004083"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:57:04.281008" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:04.280878" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.280851" elapsed="0.000230"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.281600" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:04.281244" elapsed="0.000399"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.282151" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:04.281820" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:57:04.282695" elapsed="0.000281"/>
</kw>
<msg time="2026-04-25T23:57:04.283073" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:04.283119" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:04.282339" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.283715" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:04.283306" elapsed="0.000436"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.284728" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:04.284450" elapsed="0.000306"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.285156" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:04.284903" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.285636" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.285341" 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-04-25T23:57:04.288831" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.289696" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:04.289346" elapsed="0.000378"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.289876" elapsed="0.000243"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.290915" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:04.290603" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:57:04.290987" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:57:04.291148" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:04.290312" elapsed="0.000861"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:04.291927" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc267450&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:04.291326" elapsed="0.000736"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.292224" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-25T23:57:04.288257" elapsed="0.004217"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:04.288068" elapsed="0.004451"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:57:04.285737" elapsed="0.006813"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.293126" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:04.292726" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.293740" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:04.293328" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.294345" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:04.293959" elapsed="0.000427"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:57:04.284004" elapsed="0.010441"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:57:04.276345" elapsed="0.018154"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:04.294693" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:04.294564" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.294545" elapsed="0.000216"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.297823" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:04.297424" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.298313" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:04.298020" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:04.298381" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:04.298535" 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-04-25T23:57:04.297103" elapsed="0.001457"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:04.299542" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.299274" elapsed="0.000299"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.300309" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.300408" level="INFO">${current_connection} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.300182" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.304040" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:04.303369" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.303324" elapsed="0.000890"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.304835" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.305105" level="INFO">${current_ssh_connection} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.304484" elapsed="0.000722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.306138" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:04.305469" elapsed="0.000827"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.308298" level="INFO">${conn_id} = 85</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.306568" elapsed="0.001831"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.309785" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:04.309862" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:04.309501" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.310098" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.311498" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:04.891103" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:54:46 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:04.311172" elapsed="0.580094"/>
</kw>
<msg time="2026-04-25T23:57:04.891355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.310811" elapsed="0.580634"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:04.308782" elapsed="0.582914"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.892521" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:57:04.905101" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:57:04.905385" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:57:04.905530" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:57:04.892055" elapsed="0.013574"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:04.905938" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.908536" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:04.907997" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:04.909203" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:04.908874" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.908825" elapsed="0.000522"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:57:04.909768" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-25T23:57:04.909484" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.909443" elapsed="0.000510"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:04.910043" 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-04-25T23:57:04.914109" elapsed="0.000160"/>
</kw>
<msg time="2026-04-25T23:57:04.914312" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.913493" elapsed="0.000918"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.914777" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.915047" elapsed="0.000034"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:04.910603" elapsed="0.004591"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:57:04.302321" elapsed="0.613124"/>
</kw>
<msg time="2026-04-25T23:57:04.915554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.301648" elapsed="0.613959"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:04.301153" elapsed="0.614554"/>
</kw>
<msg time="2026-04-25T23:57:04.915751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.300632" elapsed="0.615166"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:04.919306" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:57:04.919519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.918771" elapsed="0.000811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.919759" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.919923" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:04.916086" elapsed="0.003918"/>
</kw>
<msg time="2026-04-25T23:57:04.920097" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:57:04.299829" elapsed="0.620292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.920545" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:04.920295" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:04.920629" elapsed="0.000043"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:57:04.298925" elapsed="0.621844"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:04.298753" elapsed="0.622053"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:04.298610" elapsed="0.622232"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:57:04.294979" elapsed="0.625947"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:57:04.921080" elapsed="0.000211"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:04.936050" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:04.935923" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.935894" elapsed="0.000244"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.936471" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.936591" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:04.936332" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.937141" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:04.936822" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:04.937692" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:04.937365" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:04.938644" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:57:04.938334" elapsed="0.000446">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:57:04.938889" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:04.938934" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:04.937930" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.939258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:04.939034" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:04.939015" elapsed="0.000342"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:04.940121" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.939855" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:04.940196" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:04.940346" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:04.939562" elapsed="0.000808"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:04.940522" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.941244" level="INFO">index=86
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:04.941134" 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-04-25T23:57:04.941514" elapsed="0.002375"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:04.944315" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:04.945103" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:04.944054" elapsed="0.001498">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:04.949132" elapsed="0.000220"/>
</kw>
<msg time="2026-04-25T23:57:04.949498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:04.948534" 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="NOT RUN" start="2026-04-25T23:57:04.949739" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:04.949902" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:04.946358" elapsed="0.003625"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:04.945850" elapsed="0.004181"/>
</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="FAIL" start="2026-04-25T23:57:04.935573" elapsed="0.014540">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:05.969608" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:05.969467" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:05.969442" elapsed="0.000267"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:05.970051" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:05.970169" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:05.969895" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:05.970667" level="INFO">{1: 86}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:05.970354" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:05.971364" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:05.971097" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:05.971982" elapsed="0.000186"/>
</kw>
<msg time="2026-04-25T23:57:05.972269" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:05.972315" level="INFO">${old_connection_index} = 86</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:05.971573" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:05.973174" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:05.974061" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:05.973888" elapsed="0.000811">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:05.973537" elapsed="0.001298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:05.975342" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:05.975007" elapsed="0.000539"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:05.972639" elapsed="0.002954"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:05.972416" elapsed="0.003233"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:05.972397" elapsed="0.003296"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:05.976448" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:05.976178" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:05.976523" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:05.976695" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:05.975902" elapsed="0.000819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:05.976876" elapsed="0.000412"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:05.977793" level="INFO">index=87
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:05.977455" elapsed="0.000470"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:05.978074" elapsed="0.002233"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:05.980747" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:05.981958" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:05.980470" elapsed="0.001859">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:05.985973" elapsed="0.000220"/>
</kw>
<msg time="2026-04-25T23:57:05.986339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:05.985346" elapsed="0.001058"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:05.986558" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:05.986744" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:05.983151" elapsed="0.003677"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:05.982607" elapsed="0.004269"/>
</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="FAIL" start="2026-04-25T23:57:05.969073" elapsed="0.017883">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:07.008625" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:07.008493" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:07.008469" elapsed="0.000253"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:07.009048" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:07.009164" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:07.008899" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:07.009638" level="INFO">{1: 87}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:07.009345" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:07.010105" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:07.009860" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:07.010702" elapsed="0.000185"/>
</kw>
<msg time="2026-04-25T23:57:07.010987" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:07.011033" level="INFO">${old_connection_index} = 87</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:07.010311" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:07.011877" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:07.012752" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:07.012562" elapsed="0.000790">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:07.012237" elapsed="0.001250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:07.014027" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:07.013676" elapsed="0.000553"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:07.011353" elapsed="0.002922"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:07.011132" elapsed="0.003193"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:07.011113" elapsed="0.003238"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:07.015116" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:07.014846" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:07.015190" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:07.015345" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:07.014554" elapsed="0.000816"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:07.015523" elapsed="0.002032"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:07.017871" level="INFO">index=88
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:07.017745" elapsed="0.000255"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:07.018146" elapsed="0.002291"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:07.020875" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:07.022128" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:07.020598" elapsed="0.001906">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:07.026123" elapsed="0.000217"/>
</kw>
<msg time="2026-04-25T23:57:07.026488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:07.025537" elapsed="0.001065"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:07.026784" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:07.026946" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:07.023327" elapsed="0.003702"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:07.022809" elapsed="0.004268"/>
</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="FAIL" start="2026-04-25T23:57:07.008139" elapsed="0.019019">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.048057" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.047926" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.047902" elapsed="0.000238"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.048465" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:08.048594" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:08.048318" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.049090" level="INFO">{1: 88}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:08.048797" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.049537" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:08.049290" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.050145" elapsed="0.000184"/>
</kw>
<msg time="2026-04-25T23:57:08.050430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:08.050478" level="INFO">${old_connection_index} = 88</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.049765" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.051335" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.052212" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.052043" elapsed="0.000817">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.051711" elapsed="0.001286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:08.053493" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.053170" elapsed="0.000543"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:08.050821" elapsed="0.002941"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:08.050580" elapsed="0.003233"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.050561" elapsed="0.003278"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:08.054590" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.054321" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:08.054679" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:08.054838" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:08.054045" elapsed="0.000818"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.055020" elapsed="0.040312"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.095723" level="INFO">index=89
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:08.095559" elapsed="0.000375"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.096087" elapsed="0.002282"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.098819" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:08.100072" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.098534" elapsed="0.001981">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.104184" elapsed="0.000221"/>
</kw>
<msg time="2026-04-25T23:57:08.104568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.103607" elapsed="0.001029"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.104829" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.104990" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:08.101404" elapsed="0.003669"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:08.100840" elapsed="0.004281"/>
</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="FAIL" start="2026-04-25T23:57:08.047562" elapsed="0.057640">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:08.105292" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:57:04.922027" elapsed="3.183358">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:04.921635" elapsed="3.183815"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:04.921494" elapsed="3.183997"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:57:04.921347" elapsed="3.184178"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:57:04.275911" elapsed="3.829669"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.108384" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.108269" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.108248" elapsed="0.000240"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.113313" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.113206" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.113189" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.114330" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:08.113946" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.114827" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:08.114515" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:08.114897" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:08.115052" 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-04-25T23:57:08.113602" 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-04-25T23:57:08.120381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.120273" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.120254" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.121774" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.121574" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.121556" elapsed="0.000397"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:08.122519" level="INFO">${karaf_connection_index} = 89</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.122102" elapsed="0.000458"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.123062" level="INFO">${current_connection_index} = 54</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.122818" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.125113" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.124693" elapsed="0.000931">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:08.125802" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:08.125875" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.123327" elapsed="0.002586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.128105" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.127518" elapsed="0.001182">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:08.128862" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:08.128935" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.126165" elapsed="0.002808"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.130078" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.129451" elapsed="0.000805">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:08.129136" elapsed="0.001250">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:08.129115" elapsed="0.001322">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.130599" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.130988" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:08.130819" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:08.130799" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.131186" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.133489" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:57:08.133700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.133042" elapsed="0.000721"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.133979" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.134181" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:08.132342" elapsed="0.002008"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:08.131442" elapsed="0.003002"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.121230" elapsed="0.013299">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</status>
</kw>
<msg time="2026-04-25T23:57:08.134632" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:08.134854" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/CRUD-ACTION.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.120619" elapsed="0.014261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.135065" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.134958" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.134939" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.135991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.135884" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.135866" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.136321" level="INFO">index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:08.136438" level="INFO">${current_ssh_connection_object} = index=54
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:08.136207" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.136946" level="INFO">{1: 89}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:08.136638" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.137404" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:08.137141" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.137981" elapsed="0.000355"/>
</kw>
<msg time="2026-04-25T23:57:08.138502" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:08.138549" level="INFO">${old_connection_index} = 89</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.137604" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.139834" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.141286" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.141132" elapsed="0.000596">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.140440" elapsed="0.001375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:08.142845" elapsed="0.000253"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.142086" elapsed="0.001083"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:08.138955" elapsed="0.004294"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:08.138648" elapsed="0.004653"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.138629" elapsed="0.004698"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:08.144330" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.143841" elapsed="0.000516"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:08.144476" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:08.144636" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:08.143532" elapsed="0.001146"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.144835" elapsed="0.000460"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.145574" level="INFO">index=90
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:08.145464" elapsed="0.000254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.145864" elapsed="0.013691"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.160040" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:08.161183" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.159734" elapsed="0.001818">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:08.166094" elapsed="0.000146"/>
</kw>
<msg time="2026-04-25T23:57:08.166310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.165139" 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-04-25T23:57:08.167100" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.167412" elapsed="0.000063"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:08.162385" elapsed="0.005187"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:08.161855" elapsed="0.005764"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.135622" elapsed="0.032097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.168097" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:08.168171" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:08.119983" elapsed="0.048292">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:08.168405" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:08.168450" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.115445" elapsed="0.053029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:08.168819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:08.168551" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.168532" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:08.115305" elapsed="0.053616"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:08.115132" elapsed="0.053818"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:08.112916" elapsed="0.056088"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:57:08.106188" elapsed="0.062870"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:08.105760" elapsed="0.063338"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:57:04.270693" elapsed="3.898455"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:08.169573" level="INFO">Creating Session using : alias=operational, url=http://10.30.170.206:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfe453d50&gt;, timeout=None, proxies=None, verify=False,                     debug=0 </msg>
<arg>operational</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${REST_API}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:08.169294" elapsed="0.000455"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.170533" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.170260" elapsed="0.000299"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.174787" 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-04-25T23:57:08.170781" elapsed="0.004052"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:08.179161" level="INFO">Creating Session using : alias=default, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc19eb50&gt;, timeout=2, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:08.178803" elapsed="0.000461"/>
</kw>
<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="PASS" start="2026-04-25T23:57:08.178358" elapsed="0.000973"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:08.174906" elapsed="0.004457"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.174887" elapsed="0.004501"/>
</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-04-25T23:57:08.184484" level="INFO">${odl_connection} = 91</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-04-25T23:57:08.184108" elapsed="0.000402"/>
</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-04-25T23:57:08.186177" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:08.186254" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:08.185913" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.186433" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.187597" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:08.504513" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:57:04 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:08.187282" elapsed="0.317348"/>
</kw>
<msg time="2026-04-25T23:57:08.504722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.186930" elapsed="0.317865"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:08.185461" elapsed="0.319435"/>
</kw>
<msg time="2026-04-25T23:57:08.504949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.185077" elapsed="0.319918"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:08.184700" elapsed="0.320372"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:57:08.505117" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:57:08.505311" level="INFO">${odl} = 91</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-04-25T23:57:08.183818" elapsed="0.321519"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.514736" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:57:08.522981" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:57:08.505531" elapsed="0.017616"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:08.523622" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-25T23:57:08.524813" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:08.524482" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:08.524424" elapsed="0.000487"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.532060" level="INFO">${tools_connection} = 92</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:08.531462" elapsed="0.000636"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:08.534510" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:08.534618" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:08.534113" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.534893" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:08.536571" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:09.132344" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:08 UTC 2026

  System load:  0.02               Processes:             111
  Usage of /:   20.9% of 38.58GB   Users logged in:       1
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

115 updates can be applied immediately.
94 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

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

New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Apr 25 23:54:46 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:08.536126" elapsed="0.596305"/>
</kw>
<msg time="2026-04-25T23:57:09.132497" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.535575" elapsed="0.597058"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:08.533483" elapsed="0.599267"/>
</kw>
<msg time="2026-04-25T23:57:09.132802" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:08.532863" elapsed="0.599986"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-25T23:57:08.532370" elapsed="0.600554"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-25T23:57:09.132965" elapsed="0.000032"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:57:08.530933" elapsed="0.602170"/>
</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-04-25T23:57:08.179635" elapsed="0.953522"/>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-04-25T23:57:08.170006" elapsed="0.963202"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.133826" level="INFO">${DEVICE_TYPE_RPC} = rpc-device</msg>
<var>${DEVICE_TYPE_RPC}</var>
<arg>"""${USE_NETCONF_CONNECTOR}""" == """True"""</arg>
<arg>default</arg>
<arg>${DEVICE_TYPE_RPC}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:09.133380" elapsed="0.000474"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:09.134188" level="INFO" html="true">File '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/customaction/customaction.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/customaction/customaction.xml&lt;/a&gt;' exists.</msg>
<arg>${RPC_FILE}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-04-25T23:57:09.134016" elapsed="0.000224"/>
</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-04-25T23:57:09.154930" 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-04-25T23:57:09.154609" elapsed="0.000348"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.155482" 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-04-25T23:57:09.155117" elapsed="0.000392"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.156076" 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-04-25T23:57:09.155688" elapsed="0.000415"/>
</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-04-25T23:57:09.157326" elapsed="0.000307"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-25T23:57:09.158021" 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-04-25T23:57:09.157811" elapsed="0.000236"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.158593" 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-04-25T23:57:09.158207" elapsed="0.000413"/>
</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-04-25T23:57:09.176997" elapsed="0.000404"/>
</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-04-25T23:57:09.176578" elapsed="0.000892"/>
</kw>
<msg time="2026-04-25T23:57:09.177516" 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-04-25T23:57:09.168003" elapsed="0.009561"/>
</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-04-25T23:57:09.167660" elapsed="0.009977"/>
</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-04-25T23:57:09.195980" 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-04-25T23:57:09.195546" elapsed="0.000901"/>
</kw>
<msg time="2026-04-25T23:57:09.196493" 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-04-25T23:57:09.186925" elapsed="0.009616"/>
</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-04-25T23:57:09.186570" elapsed="0.010109"/>
</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-04-25T23:57:09.215124" elapsed="0.000432"/>
</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-04-25T23:57:09.214712" elapsed="0.000913"/>
</kw>
<msg time="2026-04-25T23:57:09.215688" 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-04-25T23:57:09.206197" elapsed="0.009541"/>
</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-04-25T23:57:09.205860" elapsed="0.009953"/>
</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-04-25T23:57:09.218681" 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-04-25T23:57:09.219459" elapsed="0.000178"/>
</kw>
<msg time="2026-04-25T23:57:09.219700" 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-04-25T23:57:09.219093" elapsed="0.000657"/>
</kw>
<msg time="2026-04-25T23:57:09.219850" 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-04-25T23:57:09.218405" elapsed="0.001469"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.220166" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:09.220264" level="INFO">${current_ssh_connection} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:09.220036" elapsed="0.000254"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.225107" level="INFO">${odl_connection} = 93</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-04-25T23:57:09.224723" elapsed="0.000409"/>
</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-04-25T23:57:09.227002" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:09.227079" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:09.226475" elapsed="0.000628"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:09.227270" elapsed="0.000606"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.229399" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:09.579404" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:57:08 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:09.228622" elapsed="0.350886"/>
</kw>
<msg time="2026-04-25T23:57:09.579705" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:09.228044" elapsed="0.351729"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:09.226042" elapsed="0.353820"/>
</kw>
<msg time="2026-04-25T23:57:09.579956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:09.225633" elapsed="0.354374"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:09.225309" elapsed="0.354773"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:57:09.580123" elapsed="0.000033"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:57:09.224417" elapsed="0.355846"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.580707" level="INFO">Executing command 'sh search.sh /tmp/netconf-karaf-9.0.3-SNAPSHOT/system netconf-api'.</msg>
<msg time="2026-04-25T23:57:09.613421" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:09.613700" level="INFO">${version} = 9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<msg time="2026-04-25T23:57:09.613812" 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-04-25T23:57:09.580437" elapsed="0.033426"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:09.614227" elapsed="0.000506"/>
</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-04-25T23:57:09.621733" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:57:09.622148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:09.620356" elapsed="0.001903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:09.622602" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:09.623334" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:09.615276" elapsed="0.008275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.624117" level="INFO">9.0.3-SNAPSHOT
org/opendaylight/netconf</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.623863" elapsed="0.000298"/>
</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-04-25T23:57:09.624451" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:09.624234" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.624214" elapsed="0.000314"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-04-25T23:57:09.624917" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:57:09.624961" 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-04-25T23:57:09.624686" elapsed="0.000297"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-04-25T23:57:09.625031" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:09.625220" level="INFO">${version} = 9.0.3-SNAPSHOT</msg>
<msg time="2026-04-25T23:57:09.625263" 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-04-25T23:57:09.218040" elapsed="0.407245"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:09.215890" elapsed="0.409435"/>
</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-04-25T23:57:09.625498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:09.625351" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.215869" elapsed="0.409709"/>
</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-04-25T23:57:09.625868" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:09.625635" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.625618" elapsed="0.000509"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.626644" 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-04-25T23:57:09.626275" elapsed="0.000419"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.627241" 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-04-25T23:57:09.626862" elapsed="0.000405"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.627833" 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-04-25T23:57:09.627430" elapsed="0.000429"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.628378" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-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-04-25T23:57:09.628017" elapsed="0.000387"/>
</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-04-25T23:57:09.630258" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/maven-metadata.xml'.</msg>
<msg time="2026-04-25T23:57:09.714396" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:09.714706" 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;2026042...</msg>
<msg time="2026-04-25T23:57:09.714824" 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-04-25T23:57:09.714917" 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-04-25T23:57:09.630080" elapsed="0.084888"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.716795" level="INFO">Length is 316.</msg>
<msg time="2026-04-25T23:57:09.716986" 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  41001      0 --:--:-- --:--:-- --:--:-- 41238' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-25T23:57:09.716163" elapsed="0.000973">'  % 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  41001      0 --:--:-- --:--:-- --:--:-- 41238' should be empty.</status>
</kw>
<msg time="2026-04-25T23:57:09.717378" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-25T23:57:09.717475" 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-04-25T23:57:09.715370" elapsed="0.002158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.718893" 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-04-25T23:57:09.717928" elapsed="0.001023"/>
</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-04-25T23:57:09.721249" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:57:09.720703" elapsed="0.000720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.722319" 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  41001      0 --:--:-- --:--:-- --:--:-- 41238</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.721790" elapsed="0.000630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.723442" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.722905" elapsed="0.000635"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-25T23:57:09.719899" elapsed="0.003799"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:09.719122" elapsed="0.004667"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.719078" elapsed="0.004742"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:57:09.723979" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:09.723879" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.723862" elapsed="0.000182"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:57:09.724182" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-25T23:57:09.724095" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.724080" 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-04-25T23:57:09.724404" 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-04-25T23:57:09.629526" elapsed="0.094995"/>
</kw>
<msg time="2026-04-25T23:57:09.724588" 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-04-25T23:57:09.629005" elapsed="0.095630"/>
</kw>
<msg time="2026-04-25T23:57:09.724812" 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;2026042...</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-04-25T23:57:09.628644" elapsed="0.096197"/>
</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-04-25T23:57:09.727231" 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;20260425052634&lt;/lastUpdated&gt;
    &lt;snapshot&gt;
      &lt;timestamp&gt;20260425.052634&lt;/timestamp&gt;
      &lt;buildNumber&gt;49&lt;/buildNumber&gt;
    &lt;/snapshot&gt;
    &lt;snapshotVersions&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;pom&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
      &lt;snapshotVersion&gt;
        &lt;extension&gt;jar&lt;/extension&gt;
        &lt;value&gt;9.0.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&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.3-20260425.052634-49&lt;/value&gt;
        &lt;updated&gt;20260425052634&lt;/updated&gt;
      &lt;/snapshotVersion&gt;
    &lt;/snapshotVersions&gt;
  &lt;/versioning&gt;
  &lt;version&gt;9.0.3-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-04-25T23:57:09.768125" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:09.768367" level="INFO">${stdout} = 9.0.3-20260425.052634-49</msg>
<msg time="2026-04-25T23:57:09.768465" level="INFO">${stderr} = </msg>
<msg time="2026-04-25T23:57:09.768555" 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-04-25T23:57:09.727053" elapsed="0.041552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.770539" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-25T23:57:09.769814" elapsed="0.000828"/>
</kw>
<msg time="2026-04-25T23:57:09.770968" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-25T23:57:09.771067" 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-04-25T23:57:09.769039" elapsed="0.002078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.772436" 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-04-25T23:57:09.771479" elapsed="0.001015"/>
</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-04-25T23:57:09.775416" level="INFO">9.0.3-20260425.052634-49</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.774254" elapsed="0.001264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.776441" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.775838" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.777325" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.776727" elapsed="0.000661"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-25T23:57:09.773444" elapsed="0.004020"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:09.772698" elapsed="0.004816"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.772621" elapsed="0.004928"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-25T23:57:09.777794" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:09.777626" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.777602" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:57:09.778077" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-25T23:57:09.777957" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.777936" elapsed="0.000253"/>
</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-04-25T23:57:09.778385" 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-04-25T23:57:09.726313" elapsed="0.052250"/>
</kw>
<msg time="2026-04-25T23:57:09.778635" 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-04-25T23:57:09.725802" elapsed="0.052920"/>
</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-04-25T23:57:09.725381" elapsed="0.053451"/>
</kw>
<msg time="2026-04-25T23:57:09.778964" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:09.779023" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:57:09.724997" elapsed="0.054057"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.779633" level="INFO">Length is 24.</msg>
<msg time="2026-04-25T23:57:09.779758" 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-04-25T23:57:09.779275" elapsed="0.000516"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.780872" level="INFO">${namepart} = 9.0.3-20260425.052634-49</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-04-25T23:57:09.780009" elapsed="0.000901"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.781613" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:57:09.781131" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.782226" level="INFO">netconf-testtool-9.0.3-20260425.052634-49-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.781893" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.782961" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:57:09.782490" elapsed="0.000508"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.783440" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/netconf/netconf-testtool/9.0.3-SNAPSHOT/netconf-testtool-9.0.3-20260425.052634-49-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:57:09.840635" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:09.840921" level="INFO">${response} = </msg>
<msg time="2026-04-25T23:57:09.841022" 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-04-25T23:57:09.783213" elapsed="0.057861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.842131" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.841523" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:57:09.842637" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-25T23:57:09.842371" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.842329" elapsed="0.000531"/>
</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-04-25T23:57:09.843185" elapsed="0.000047"/>
</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-04-25T23:57:09.843575" elapsed="0.000045"/>
</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-04-25T23:57:09.844143" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:09.843811" elapsed="0.000449"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:09.843769" elapsed="0.000542"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-25T23:57:09.844379" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:09.844759" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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.3-SNAPSHOT/netconf-karaf-9.0.3-20260425.052634-49.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-04-25T23:57:09.156721" elapsed="0.688104"/>
</kw>
<return>
<value>${filename}</value>
<status status="PASS" start="2026-04-25T23:57:09.844977" elapsed="0.000064"/>
</return>
<msg time="2026-04-25T23:57:09.845307" level="INFO">${filename} = netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:57:09.148862" elapsed="0.696499"/>
</kw>
<kw name="Start_Testtool" owner="NetconfKeywords">
<kw name="NetconfKeywords__Deploy_Additional_Schemas" owner="NetconfKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.847977" level="INFO">Executing command 'rm -rf schemas 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:57:09.892217" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:09.892441" 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-04-25T23:57:09.847836" elapsed="0.044662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:09.893488" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:09.892906" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="'${schemas}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-25T23:57:09.894017" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:09.893767" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:09.893724" elapsed="0.000441"/>
</if>
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:57:09.940731" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:57:10.037112" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/yang-ext@2013-07-09.yang' -&gt; '/home/jenkins/./schemas/yang-ext@2013-07-09.yang'</msg>
<msg time="2026-04-25T23:57:10.037178" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/example-action@2016-07-07.yang' -&gt; '/home/jenkins/./schemas/example-action@2016-07-07.yang'</msg>
<msg time="2026-04-25T23:57:10.037220" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/car@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:57:10.037258" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/car-purchase@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-purchase@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:57:10.037295" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/ncmount-l2fib@2016-03-07.yang' -&gt; '/home/jenkins/./schemas/ncmount-l2fib@2016-03-07.yang'</msg>
<msg time="2026-04-25T23:57:10.037333" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:10.037370" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:10.037406" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:10.037443" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:57:10.037545" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/test@2014-10-18.yang' -&gt; '/home/jenkins/./schemas/test@2014-10-18.yang'</msg>
<msg time="2026-04-25T23:57:10.037587" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas/car-people@2014-08-18.yang' -&gt; '/home/jenkins/./schemas/car-people@2014-08-18.yang'</msg>
<msg time="2026-04-25T23:57:10.037623" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:10.037691" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:09.894511" elapsed="0.143265"/>
</kw>
<kw name="List Directory" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.041447" 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-04-25T23:57:10.038032" elapsed="0.003496"/>
</kw>
<return>
<value>--schemas-dir ./schemas</value>
<status status="PASS" start="2026-04-25T23:57:10.041592" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:57:10.041812" 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-04-25T23:57:09.847412" elapsed="0.194435"/>
</kw>
<kw name="NetconfKeywords__Deploy_Custom_RPC" owner="NetconfKeywords">
<if>
<branch type="IF" condition="'${rpc_config}' == 'none'">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-25T23:57:10.042700" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:10.042509" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:10.042483" elapsed="0.000312"/>
</if>
<kw name="Copy_File_To_Tools_System" owner="SSHKeywords">
<kw name="Copy_File_To_Remote_System" owner="SSHKeywords">
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.045439" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:10.045579" level="INFO">${current_connection} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:10.045261" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Unsafe_Copy_File_To_Remote_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:10.061120" elapsed="0.000415"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.062691" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:10.062809" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:10.062140" elapsed="0.000694"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:10.063020" elapsed="0.000696"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.065772" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:10.373683" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:08 UTC 2026

  System load:  0.02               Processes:             111
  Usage of /:   20.9% of 38.58GB   Users logged in:       1
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

115 updates can be applied immediately.
94 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

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

New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Apr 25 23:57:09 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:10.065193" elapsed="0.308723"/>
</kw>
<msg time="2026-04-25T23:57:10.374054" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:10.063946" elapsed="0.310277"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:10.061755" elapsed="0.312647"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.382381" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:57:10.389309" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/customaction/customaction.xml' -&gt; '/tmp/customaction.xml'</msg>
<arg>${source}</arg>
<arg>${destination}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-04-25T23:57:10.374677" elapsed="0.014768"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:10.389951" elapsed="0.000525"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Copy the ${source} file to the ${destination} file on the remote ${system}. The keyword opens and closes a single
ssh connection and does not rely on any existing ssh connection that may be open.</doc>
<status status="PASS" start="2026-04-25T23:57:10.060644" elapsed="0.329963"/>
</kw>
<msg time="2026-04-25T23:57:10.390785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:10.045851" elapsed="0.345058"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:10.397220" elapsed="0.000236"/>
</kw>
<msg time="2026-04-25T23:57:10.397517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:10.396317" elapsed="0.001288"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:10.397855" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:10.398105" 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-04-25T23:57:10.391608" elapsed="0.006612"/>
</kw>
<arg>SSHKeywords.Unsafe_Copy_File_To_Remote_System</arg>
<arg>${system}</arg>
<arg>${source}</arg>
<arg>${destination}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>${prompt}</arg>
<arg>${prompt_timeout}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:57:10.044567" elapsed="0.353734"/>
</kw>
<arg>${system}</arg>
<arg>${source}</arg>
<arg>${destination}</arg>
<arg>${TOOLS_SYSTEM_USER}</arg>
<arg>${TOOLS_SYSTEM_PASSWORD}</arg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Copy the /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/customaction/customaction.xml file to the /tmp file on the remote 10.30.171.48. Any pre-existing active
ssh connection will be retained.</doc>
<status status="PASS" start="2026-04-25T23:57:10.043756" elapsed="0.354647"/>
</kw>
<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="PASS" start="2026-04-25T23:57:10.043061" elapsed="0.355717"/>
</kw>
<return>
<value>--rpc-config /tmp/customaction.xml</value>
<status status="PASS" start="2026-04-25T23:57:10.398847" elapsed="0.000048"/>
</return>
<msg time="2026-04-25T23:57:10.399041" level="INFO">${rpc_config_option} = --rpc-config /tmp/customaction.xml</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-04-25T23:57:10.042195" elapsed="0.356882"/>
</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-04-25T23:57:10.400903" elapsed="0.000445"/>
</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-04-25T23:57:10.401576" elapsed="0.002320"/>
</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-04-25T23:57:10.404135" elapsed="0.000446"/>
</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-04-25T23:57:10.406326" level="INFO">Executing command 'ls -lA /usr/lib/jvm/java-21-openjdk-amd64/bin/java 2&gt;&amp;1'.</msg>
<msg time="2026-04-25T23:57:10.419033" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:10.419271" level="INFO">${out} = -rwxr-xr-x 1 root root 14456 Jan 22 23:45 /usr/lib/jvm/java-21-openjdk-amd64/bin/java</msg>
<msg time="2026-04-25T23:57:10.419373" 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-04-25T23:57:10.406078" elapsed="0.013346"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${specific_path}</value>
<status status="PASS" start="2026-04-25T23:57:10.419925" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-04-25T23:57:10.419604" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:10.419557" elapsed="0.000605"/>
</if>
<return>
<value>${default_path}</value>
<status status="NOT RUN" start="2026-04-25T23:57:10.420240" elapsed="0.000033"/>
</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-04-25T23:57:10.405534" elapsed="0.014959"/>
</kw>
<msg time="2026-04-25T23:57:10.420589" 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-04-25T23:57:10.404840" elapsed="0.015890"/>
</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-04-25T23:57:10.421106" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>java</value>
<status status="NOT RUN" start="2026-04-25T23:57:10.421395" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:10.421316" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:10.421277" elapsed="0.000255"/>
</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-04-25T23:57:10.421982" 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-04-25T23:57:10.422369" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:57:10.422676" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:10.422571" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:10.422534" elapsed="0.000312"/>
</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-04-25T23:57:10.423155" 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-04-25T23:57:10.423547" 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-04-25T23:57:10.424001" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="${rc} == 0">
<return>
<value>${java}</value>
<status status="NOT RUN" start="2026-04-25T23:57:10.424282" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:10.424203" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:10.424167" elapsed="0.000253"/>
</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-04-25T23:57:10.424745" elapsed="0.000047"/>
</kw>
<msg time="2026-04-25T23:57:10.425019" 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-04-25T23:57:10.400433" elapsed="0.024640"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.426236" 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.3-20260425.052634-49-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-04-25T23:57:10.425408" elapsed="0.000888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.427028" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas --rpc-config /tmp/customaction.xml --md-sal true</msg>
<arg>${full_command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:10.426633" elapsed="0.000458"/>
</kw>
<return>
<value>${full_command}</value>
<status status="PASS" start="2026-04-25T23:57:10.427149" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:57:10.427360" level="INFO">${command} = /usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-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-04-25T23:57:10.399399" elapsed="0.027997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.427974" 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.3-20260425.052634-49-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas --rpc-config /tmp/customaction.xml --md-sal true</msg>
<arg>Running testtool: ${command}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:10.427609" elapsed="0.000429"/>
</kw>
<kw name="Get Log File Name" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.431885" level="INFO">${name} = netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION</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-04-25T23:57:10.431297" elapsed="0.000625"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.435121" 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-04-25T23:57:10.432148" elapsed="0.002999"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.435480" level="INFO">${date} = 2026-04-25 23:57:10.435</msg>
<var>${date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:57:10.435310" elapsed="0.000196"/>
</kw>
<kw name="Convert Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.435975" level="INFO">${timestamp} = 1777161430.435</msg>
<var>${timestamp}</var>
<arg>${date}</arg>
<arg>epoch</arg>
<doc>Converts between supported `date formats`.</doc>
<status status="PASS" start="2026-04-25T23:57:10.435673" elapsed="0.000327"/>
</kw>
<return>
<value>${testtool}--${name}${suffix}.${timestamp}.log</value>
<status status="PASS" start="2026-04-25T23:57:10.436047" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:10.436281" level="INFO">${logfile} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION.1777161430.435.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-04-25T23:57:10.428352" elapsed="0.007955"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.441435" level="INFO">${testtool_log} = testtool--netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION.1777161430.435.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-04-25T23:57:10.436468" elapsed="0.005015"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.460571" level="INFO">/usr/lib/jvm/java-21-openjdk-amd64/bin/java -Xmx1G -Djava.security.egd=file:/dev/./urandom -jar netconf-testtool-9.0.3-20260425.052634-49-executable.jar  --device-count 1 --debug true --schemas-dir ./schemas --rpc-config /tmp/customaction.xml --md-sal true &gt;testtool--netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION.1777161430.435.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-04-25T23:57:10.441690" elapsed="0.018944"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.464705" 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-04-25T23:57:10.460813" elapsed="0.003942"/>
</kw>
<kw name="Perform_Operation_On_Each_Device" owner="NetconfKeywords">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.465508" level="INFO">${current_Date} = 2026-04-25 23:57:10.465</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:57:10.465356" elapsed="0.000178"/>
</kw>
<kw name="Add Time To Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.466041" level="INFO">${deadline_Date} = 2026-04-26 00:42:10.465</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-04-25T23:57:10.465696" elapsed="0.000371"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.470851" 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-04-25T23:57:10.466228" elapsed="0.004669"/>
</kw>
<kw name="Repeat Keyword" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.471376" 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-04-25T23:57:10.472442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:10.472333" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:10.472314" elapsed="0.000192"/>
</if>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.472823" level="INFO">${current_Date} = 2026-04-25 23:57:10.473</msg>
<var>${current_Date}</var>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-25T23:57:10.472666" elapsed="0.000183"/>
</kw>
<kw name="Subtract Date From Date" owner="DateTime">
<msg time="2026-04-25T23:57:10.473303" 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-04-25T23:57:10.472997" elapsed="0.000332"/>
</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-04-25T23:57:10.473636" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:10.473398" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:10.473380" elapsed="0.000351"/>
</if>
<arg>${deadline_Date}</arg>
<status status="PASS" start="2026-04-25T23:57:10.472142" elapsed="0.001636"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.474300" 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-04-25T23:57:10.473934" 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-04-25T23:57:10.475698" 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-04-25T23:57:10.475344" 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-04-25T23:57:10.477371" 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-04-25T23:57:10.476754" elapsed="0.000717"/>
</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-04-25T23:57:10.480479" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:57:10.492923" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:10.493060" 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-04-25T23:57:10.480384" elapsed="0.012712"/>
</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-04-25T23:57:10.493645" elapsed="0.000063"/>
</kw>
<msg time="2026-04-25T23:57:10.493757" 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-04-25T23:57:10.493199" elapsed="0.000688">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-04-25T23:57:10.493170" elapsed="0.000950">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-04-25T23:57:10.480169" elapsed="0.014130">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-04-25T23:57:10.479776" elapsed="0.014613"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:10.494978" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:57:10.556413" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:10.556621" 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-04-25T23:57:10.494636" elapsed="0.062076"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:10.556867" elapsed="0.000076"/>
</return>
<msg time="2026-04-25T23:57:10.557557" 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-04-25T23:57:10.479235" elapsed="0.078455"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:57:10.561194" 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-04-25T23:57:10.559809" elapsed="0.001632">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:57:10.477847" elapsed="0.083918">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-04-25T23:57:10.476382" elapsed="0.085798">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:11.565936" 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-04-25T23:57:11.564283" elapsed="0.001803"/>
</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-04-25T23:57:11.570437" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:57:11.583785" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:11.584008" 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-04-25T23:57:11.570281" elapsed="0.013787"/>
</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-04-25T23:57:11.585041" elapsed="0.000059"/>
</kw>
<msg time="2026-04-25T23:57:11.585181" 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-04-25T23:57:11.584254" elapsed="0.001175">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-04-25T23:57:11.584199" elapsed="0.001340">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-04-25T23:57:11.569962" elapsed="0.015927">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-04-25T23:57:11.569347" elapsed="0.016692"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:11.586988" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:57:11.632497" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:11.632743" 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-04-25T23:57:11.586438" elapsed="0.046364"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:11.632965" elapsed="0.000082"/>
</return>
<msg time="2026-04-25T23:57:11.633744" 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-04-25T23:57:11.568541" elapsed="0.065305"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:57:11.637512" 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-04-25T23:57:11.636030" elapsed="0.001779">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:57:11.566567" elapsed="0.071528">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-04-25T23:57:11.563139" elapsed="0.075366">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:12.642367" 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-04-25T23:57:12.640585" elapsed="0.002019"/>
</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-04-25T23:57:12.650186" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:57:12.663230" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:12.663460" 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-04-25T23:57:12.650069" elapsed="0.013458"/>
</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-04-25T23:57:12.664528" elapsed="0.000065"/>
</kw>
<msg time="2026-04-25T23:57:12.664709" 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-04-25T23:57:12.663759" elapsed="0.001192">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-04-25T23:57:12.663699" elapsed="0.001359">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-04-25T23:57:12.649761" elapsed="0.015593">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-04-25T23:57:12.648720" elapsed="0.016785"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:12.666484" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:57:12.712374" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:12.712592" 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-04-25T23:57:12.665974" elapsed="0.046707"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:12.712885" elapsed="0.000083"/>
</return>
<msg time="2026-04-25T23:57:12.713628" 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-04-25T23:57:12.646822" elapsed="0.066952"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:57:12.717502" 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-04-25T23:57:12.715993" elapsed="0.001811">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:57:12.643412" elapsed="0.074675">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-04-25T23:57:12.639441" elapsed="0.079083">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:13.722162" 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-04-25T23:57:13.720497" elapsed="0.001898"/>
</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-04-25T23:57:13.729480" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:57:13.752574" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:13.752857" 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-04-25T23:57:13.729243" elapsed="0.023687"/>
</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-04-25T23:57:13.753904" elapsed="0.000067"/>
</kw>
<msg time="2026-04-25T23:57:13.754054" 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-04-25T23:57:13.753115" elapsed="0.001152">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-04-25T23:57:13.753064" elapsed="0.001306">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-04-25T23:57:13.728734" elapsed="0.025951">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-04-25T23:57:13.727710" elapsed="0.027131"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:13.755802" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:57:13.839560" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:13.839811" 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-04-25T23:57:13.755255" elapsed="0.084613"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:13.840029" elapsed="0.000081"/>
</return>
<msg time="2026-04-25T23:57:13.840800" 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-04-25T23:57:13.726436" elapsed="0.114466"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-25T23:57:13.844436" 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-04-25T23:57:13.843006" elapsed="0.001702">0 != 1</status>
</kw>
<arg>${device-port}</arg>
<status status="FAIL" start="2026-04-25T23:57:13.723191" elapsed="0.121799">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-04-25T23:57:13.719380" elapsed="0.126010">0 != 1</status>
</kw>
<kw name="Check_Device_Up_And_Running" owner="NetconfKeywords">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.849425" 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-04-25T23:57:14.847894" elapsed="0.001788"/>
</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-04-25T23:57:14.856375" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-04-25T23:57:14.869113" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:14.869340" 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-04-25T23:57:14.856260" elapsed="0.013140"/>
</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-04-25T23:57:14.870359" elapsed="0.000058"/>
</kw>
<msg time="2026-04-25T23:57:14.870499" 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-04-25T23:57:14.869577" elapsed="0.001150">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-04-25T23:57:14.869526" elapsed="0.001304">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-04-25T23:57:14.856035" elapsed="0.015095">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-04-25T23:57:14.855010" elapsed="0.016270"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.872311" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17830 .+ LISTEN .+java" | wc -l'.</msg>
<msg time="2026-04-25T23:57:14.920009" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:57:14.920228" 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-04-25T23:57:14.871769" elapsed="0.048516"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:14.920444" elapsed="0.000079"/>
</return>
<msg time="2026-04-25T23:57:14.921223" 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-04-25T23:57:14.853721" elapsed="0.067602"/>
</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-04-25T23:57:14.923572" elapsed="0.001308"/>
</kw>
<arg>${device-port}</arg>
<status status="PASS" start="2026-04-25T23:57:14.850439" elapsed="0.074551"/>
</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-04-25T23:57:14.846216" elapsed="0.078950"/>
</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-04-25T23:57:10.475883" elapsed="4.449352"/>
</kw>
<arg>${DEVICE_NAME_BASE}-${number}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:57:10.474952" elapsed="4.450366"/>
</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-04-25T23:57:10.474479" elapsed="4.450902"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.926131" 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-04-25T23:57:14.925604" elapsed="0.000566"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.926975" 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-04-25T23:57:14.926405" elapsed="0.000630"/>
</kw>
<arg>${operation}</arg>
<arg>${deadline_Date}</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:57:10.471571" elapsed="4.455558"/>
</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-04-25T23:57:10.471058" elapsed="4.456145"/>
</kw>
<arg>NetconfKeywords__Wait_Device_Is_Up_And_Running</arg>
<arg>log_response=${log_response}</arg>
<status status="PASS" start="2026-04-25T23:57:10.464948" elapsed="4.462342"/>
</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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../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-04-25T23:57:09.845974" elapsed="5.081386"/>
</kw>
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/schemas</arg>
<arg>rpc_config=${RPC_FILE}</arg>
<arg>mdsal=true</arg>
<doc>Install and run testtool.</doc>
<status status="PASS" start="2026-04-25T23:57:09.134450" elapsed="5.793067"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="PASS" start="2026-04-25T23:57:04.270373" elapsed="10.657229"/>
</kw>
<test id="s1-s5-s1-t1" name="Check_Device_Is_Not_Configured_At_Beginning" line="44">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:14.932678" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:14.932282" 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-04-25T23:57:14.934588" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.934425" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.934396" elapsed="0.000318"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.940791" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.940679" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.940646" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.941884" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:14.941479" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.942380" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:14.942071" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:14.942451" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:14.942612" 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-04-25T23:57:14.941092" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.948225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.948115" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.948096" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.949536" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.949419" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.949401" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:14.950144" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:14.949770" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.950596" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:14.950330" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.951489" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.951202" elapsed="0.001300">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:14.952709" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:14.952758" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.950797" elapsed="0.001985"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.953665" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.953352" elapsed="0.001379">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:14.954909" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:14.954955" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.952953" elapsed="0.002026"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.956098" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.955275" elapsed="0.000947">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:14.955054" elapsed="0.001268">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:14.955034" elapsed="0.001324">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.956520" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.956774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:14.956615" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:14.956597" elapsed="0.000276"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.956911" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:14.960212" elapsed="0.000157"/>
</kw>
<msg time="2026-04-25T23:57:14.960445" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:14.959437" elapsed="0.001106"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.961685" elapsed="0.000043"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.962751" elapsed="0.000042"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:14.957864" elapsed="0.005011"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:14.957182" elapsed="0.005809"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.949117" elapsed="0.013962">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</status>
</kw>
<msg time="2026-04-25T23:57:14.963184" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:14.963229" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Is_Not_Configured_At_Beginning"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.948455" elapsed="0.014799"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.963485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.963364" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.963344" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.964416" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:14.964306" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.964288" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.964789" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:14.964897" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:14.964637" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.965453" level="INFO">{1: 90}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:14.965078" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:14.965930" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:14.965665" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:14.966486" elapsed="0.000448"/>
</kw>
<msg time="2026-04-25T23:57:14.967036" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:14.967083" level="INFO">${old_connection_index} = 90</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.966129" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:14.967973" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.970190" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.969708" elapsed="0.001187">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.968381" elapsed="0.002627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:14.972545" elapsed="0.000392"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.971248" elapsed="0.001754"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:14.967402" elapsed="0.005705"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:14.967181" elapsed="0.005977"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.967162" elapsed="0.006022"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:14.974184" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:14.973732" elapsed="0.000479"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:14.974260" elapsed="0.000047"/>
</return>
<msg time="2026-04-25T23:57:14.974452" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:14.973392" elapsed="0.001086"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:14.974633" elapsed="0.000480"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.975564" level="INFO">index=95
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:14.975284" elapsed="0.000447"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:14.975893" elapsed="0.002277"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:14.978594" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:14.979807" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.978333" elapsed="0.001864">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:14.990986" elapsed="0.000336"/>
</kw>
<msg time="2026-04-25T23:57:14.991381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:14.989512" elapsed="0.002150"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.992019" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.992292" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:14.981009" elapsed="0.011427"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:14.980472" elapsed="0.012012"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.964004" elapsed="0.028564">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.993227" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:14.993302" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.947769" elapsed="0.045638">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:14.993511" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:14.993554" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.943041" elapsed="0.050536"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:14.993922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:14.993668" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:14.993635" elapsed="0.000402"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:14.942896" elapsed="0.051165"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:14.942711" elapsed="0.051381"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:14.940289" elapsed="0.053865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:14.933994" elapsed="0.060217"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:14.933298" elapsed="0.060958"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:14.928844" elapsed="0.065464"/>
</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-04-25T23:57:15.006341" 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-04-25T23:57:15.003982" elapsed="0.002386"/>
</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-04-25T23:57:15.006714" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:15.006546" elapsed="0.000227"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.006423" elapsed="0.000376"/>
</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-04-25T23:57:15.007107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.006860" elapsed="0.000310"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.007973" level="INFO">${uri} = /restconf/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-04-25T23:57:15.007438" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.007194" 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-04-25T23:57:15.008237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.008068" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.006843" elapsed="0.001470"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.008347" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:15.008497" level="INFO">${uri} = /restconf/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-04-25T23:57:15.003432" elapsed="0.005089"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.008566" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:15.008725" level="INFO">${uri} = /restconf/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-04-25T23:57:15.002932" elapsed="0.005817"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.016043" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.015789" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.016484" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.016240" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:15.021262" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.018675" elapsed="0.004272">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.016593" elapsed="0.006434">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.023212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.023061" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.016574" elapsed="0.006725">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.023753" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.023886" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.023849" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.023832" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.024091" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.024161" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.011388" elapsed="0.012878">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.024337" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:15.008965" elapsed="0.015467">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.024598" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:15.024780" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.024845" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:14.994941" elapsed="0.030001">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.025105" elapsed="0.000021"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<doc>Check that there are no instances of the specified device in the Netconf topology.</doc>
<status status="FAIL" start="2026-04-25T23:57:14.994522" elapsed="0.030690">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:14.927727" elapsed="0.097629">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t2" name="Configure_Device_On_Netconf" line="49">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:15.028920" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:15.028639" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.030199" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.030087" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.030067" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.035244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.035130" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.035106" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.036313" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:15.035934" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.036807" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:15.036498" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:15.036878" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:15.037031" 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-04-25T23:57:15.035531" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.042581" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.042471" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.042452" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.043917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.043808" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.043790" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.044496" 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-04-25T23:57:15.044134" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.044953" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.044700" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.045943" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.045527" elapsed="0.001304">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.047018" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:15.047064" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.045137" elapsed="0.001951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.047972" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.047679" elapsed="0.001337">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.049192" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:15.049237" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.047255" elapsed="0.002005"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.050163" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.049553" elapsed="0.000690">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.049336" elapsed="0.000999">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.049316" elapsed="0.001053">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.050527" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.050767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.050612" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.050596" elapsed="0.000266"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.050894" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.054007" elapsed="0.000166"/>
</kw>
<msg time="2026-04-25T23:57:15.054258" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.053246" elapsed="0.001114"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.055308" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.056381" elapsed="0.000039"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.051765" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.051151" elapsed="0.005469"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.043447" elapsed="0.013278">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</status>
</kw>
<msg time="2026-04-25T23:57:15.056832" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.056877" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Configure_Device_On_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.042820" elapsed="0.014123"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.057145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.057030" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.057007" 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-04-25T23:57:15.058064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.057959" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.057941" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.058425" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.058529" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.058291" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.058985" level="INFO">{1: 95}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.058723" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.059478" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.059180" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.060228" elapsed="0.000338"/>
</kw>
<msg time="2026-04-25T23:57:15.060680" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:15.060728" level="INFO">${old_connection_index} = 95</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.059855" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.061568" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.064036" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.063487" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.061991" elapsed="0.002730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.066240" elapsed="0.000370"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.064968" elapsed="0.001722"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:15.061051" elapsed="0.005755"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.060830" elapsed="0.006028"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.060809" elapsed="0.006074"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.067922" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.067423" elapsed="0.000527"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:15.067998" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:15.068153" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.067088" elapsed="0.001090"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.068331" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.069057" level="INFO">index=96
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.068946" 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-04-25T23:57:15.069329" elapsed="0.002570"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.072325" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:15.073264" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.072064" elapsed="0.001579">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.084226" elapsed="0.000324"/>
</kw>
<msg time="2026-04-25T23:57:15.084609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.082789" elapsed="0.001930"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.085050" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.085309" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.074491" elapsed="0.010960"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.073972" elapsed="0.011527"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.057631" elapsed="0.027950">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.085943" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.086019" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.042128" elapsed="0.043999">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:15.086234" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.086277" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.037455" elapsed="0.048846"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.086632" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.086380" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.086361" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:15.037316" elapsed="0.049450"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:15.037143" elapsed="0.049662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:15.034754" elapsed="0.052107"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:15.029788" elapsed="0.057134"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.029338" elapsed="0.057630"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:15.026230" elapsed="0.060791"/>
</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-04-25T23:57:15.108737" elapsed="0.000443"/>
</kw>
<msg time="2026-04-25T23:57:15.109231" 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-04-25T23:57:15.108362" elapsed="0.000919"/>
</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-04-25T23:57:15.107961" elapsed="0.001396"/>
</kw>
<msg time="2026-04-25T23:57:15.109399" 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-04-25T23:57:15.099230" elapsed="0.010211"/>
</kw>
<msg time="2026-04-25T23:57:15.109544" 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-04-25T23:57:15.098901" elapsed="0.010666"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.110480" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:57:15.109746" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:57:15.143245" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:57:15.142863" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:15.144055" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:57:15.143826" elapsed="0.000295">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:15.144215" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:15.143433" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.144816" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:15.144400" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:15.145143" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:15.145304" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:15.145005" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.145756" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:create-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.145481" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.146934" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.146487" elapsed="0.000495"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.147407" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.147141" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.148353" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:15.147846" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.149540" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.149049" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.149723" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:15.149960" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:15.148573" elapsed="0.001412"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.150137" elapsed="0.000485"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:57:15.147708" elapsed="0.002976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.151440" 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-04-25T23:57:15.150936" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.152611" 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-04-25T23:57:15.152135" elapsed="0.000540"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.152800" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.153035" 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-04-25T23:57:15.151692" elapsed="0.001369"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.153210" elapsed="0.000512"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:15.150803" elapsed="0.002961"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.154547" 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-04-25T23:57:15.154043" elapsed="0.000531"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.155761" 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-04-25T23:57:15.155225" elapsed="0.000578"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.155917" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:15.156148" 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-04-25T23:57:15.154783" elapsed="0.001391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.156323" elapsed="0.000509"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:57:15.153878" elapsed="0.002997"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.157622" 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-04-25T23:57:15.157121" elapsed="0.000604"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.158858" 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-04-25T23:57:15.158357" elapsed="0.000542"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.159018" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.159245" 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-04-25T23:57:15.157919" elapsed="0.001351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.159420" elapsed="0.000533"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:57:15.156990" elapsed="0.003005"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.160761" 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-04-25T23:57:15.160241" elapsed="0.000561"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.162041" 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-04-25T23:57:15.161448" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.162200" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:57:15.162439" 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-04-25T23:57:15.160992" elapsed="0.001473"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.162615" elapsed="0.000495"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:57:15.160109" elapsed="0.003044"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.163939" 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-04-25T23:57:15.163397" elapsed="0.000570"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.165289" 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-04-25T23:57:15.164786" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.165444" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:15.165757" 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-04-25T23:57:15.164326" 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-04-25T23:57:15.165947" elapsed="0.000473"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:57:15.163266" elapsed="0.003196"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.167228" 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-04-25T23:57:15.166720" elapsed="0.000535"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.168433" 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-04-25T23:57:15.167953" elapsed="0.000520"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.168586" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.168832" 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-04-25T23:57:15.167439" elapsed="0.001418"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.169022" elapsed="0.000477"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:57:15.166574" elapsed="0.002968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.170551" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:15.169984" elapsed="0.000594"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:15.171764" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.171240" elapsed="0.000566"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:15.171920" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:57:15.172163" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:15.170788" elapsed="0.001401"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.172340" elapsed="0.000497"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:15.169838" elapsed="0.003042"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:15.147485" elapsed="0.025435"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:15.172967" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.173134" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:15.146166" elapsed="0.026995"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.145870" elapsed="0.027323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.173364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.173217" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.145851" elapsed="0.027588"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.174285" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:create-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-04-25T23:57:15.173578" elapsed="0.000734"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:15.174361" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:15.142219" elapsed="0.032268"/>
</kw>
<msg time="2026-04-25T23:57:15.174539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.129410" elapsed="0.045177"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.187614" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.200068" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.212831" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.213034" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.213206" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.213617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.213464" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.213450" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.213853" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.214017" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.214180" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:15.213422" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.213318" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.214402" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.214477" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:15.214587" level="INFO">${uri} = /restconf/operations/netconf-node-topology:create-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-04-25T23:57:15.125058" elapsed="0.089560"/>
</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-04-25T23:57:15.239598" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.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-04-25T23:57:15.239210" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:15.240352" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.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-04-25T23:57:15.240141" elapsed="0.000275">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:15.240509" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:15.239801" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.241108" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/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-04-25T23:57:15.240711" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:15.241431" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:15.241560" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/usern...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:15.241294" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.242012" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
   &lt;host&gt;$DEVICE_IP&lt;/host&gt;
   &lt;port&gt;$DEVICE_PORT&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;$DEVICE_USER&lt;/username&gt;
     &lt;password&gt;$DEVICE_PASSWORD&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.241759" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:57:15.242423" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.242131" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.242965" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:15.242663" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.242506" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.242112" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.244033" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:57:15.243280" elapsed="0.000789"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:15.244120" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:15.238569" elapsed="0.005681"/>
</kw>
<msg time="2026-04-25T23:57:15.244305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.225772" elapsed="0.018581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.257082" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.269696" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.282418" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.282629" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.282830" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.283208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.283063" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.283048" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.283428" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.283618" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.283805" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:15.283016" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.282909" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.284048" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.284139" elapsed="0.000017"/>
</return>
<msg time="2026-04-25T23:57:15.284274" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&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-04-25T23:57:15.224889" elapsed="0.059415"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:15.285751" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.285467" elapsed="0.000354">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-create-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:15.285916" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:15.285107" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.286263" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.286011" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.286855" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:15.286516" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.286343" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.285993" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.289438" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:15.287089" elapsed="0.002376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:15.289518" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.289698" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-create-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:15.284754" elapsed="0.004972"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.291264" level="INFO">/restconf/operations/netconf-node-topology:create-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.291014" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.291803" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
   &lt;host&gt;10.30.171.48&lt;/host&gt;
   &lt;port&gt;17830&lt;/port&gt;
   &lt;login-password&gt;
     &lt;username&gt;admin&lt;/username&gt;
     &lt;password&gt;topsecret&lt;/password&gt;
   &lt;/login-password&gt;
   &lt;tcp-only&gt;false&lt;/tcp-only&gt;
   &lt;keepalive-delay&gt;0&lt;/keepalive-delay&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.291462" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.292254" 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-04-25T23:57:15.292007" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.292705" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.292445" elapsed="0.000315"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.293691" 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-04-25T23:57:15.293458" elapsed="0.000264"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:15.294162" 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-04-25T23:57:15.293919" elapsed="0.000284"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.294388" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.295065" 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-04-25T23:57:15.294814" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:15.295151" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:15.295330" 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-04-25T23:57:15.293003" elapsed="0.002356"/>
</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">
<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="NOT RUN" start="2026-04-25T23:57:15.297747" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.295433" elapsed="0.002383"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:15.300915" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:57:15.297984" elapsed="0.004655">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.297841" elapsed="0.004910">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.295414" elapsed="0.007370">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.303166" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.303306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.303268" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.303250" 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-04-25T23:57:15.303544" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.303615" 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-04-25T23:57:15.290054" elapsed="0.013687">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.303826" 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-04-25T23:57:15.113740" elapsed="0.190183">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:15.304219" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.304040" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.304023" elapsed="0.000287"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.304343" elapsed="0.000015"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.110971" elapsed="0.193478">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.110635" elapsed="0.193886">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.304811" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.304552" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.110615" elapsed="0.194285">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:57:15.305052" elapsed="0.000022"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=${DEVICE_TYPE_RPC_CREATE}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.087305" elapsed="0.217895">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:15.025676" elapsed="0.279687">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:create-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t3" name="Check_ODL_Has_Netconf_Connector_For_Device" 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-04-25T23:57:15.308901" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:15.308605" 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-04-25T23:57:15.310205" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.310091" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.310073" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.315441" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.315333" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.315315" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.316543" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:15.316157" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.317056" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:15.316754" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:15.317127" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:15.317283" 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-04-25T23:57:15.315777" 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-04-25T23:57:15.322852" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.322740" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.322720" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.324204" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.324097" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.324080" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.324806" 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-04-25T23:57:15.324415" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.325250" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.324990" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.326131" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.325845" elapsed="0.001196">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.327224" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:15.327271" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.325431" elapsed="0.001863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.328185" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.327902" elapsed="0.001371">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.329454" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:15.329499" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.327473" elapsed="0.002049"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.330706" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.329923" elapsed="0.000906">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.329600" elapsed="0.001361">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.329580" elapsed="0.001417">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.331159" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.331385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.331246" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.331229" elapsed="0.000269"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.331532" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.334615" elapsed="0.000180"/>
</kw>
<msg time="2026-04-25T23:57:15.334869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.333935" 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-04-25T23:57:15.335980" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.337004" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.332409" elapsed="0.004713"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.331811" elapsed="0.005427"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.323790" elapsed="0.013534">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</status>
</kw>
<msg time="2026-04-25T23:57:15.337427" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.337471" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_ODL_Has_Netconf_Connector_For_Device"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.323075" elapsed="0.014420"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.337697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.337572" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.337553" 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-04-25T23:57:15.338568" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.338462" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.338444" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.338932" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.339049" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.338802" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.339509" level="INFO">{1: 96}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.339227" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.340097" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.339835" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.340672" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:57:15.341097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:15.341144" level="INFO">${old_connection_index} = 96</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.340300" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.341989" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.344241" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.343812" elapsed="0.000984">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.342401" elapsed="0.002506"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.346410" elapsed="0.000380"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.345155" elapsed="0.001699"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:15.341463" elapsed="0.005497"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.341244" elapsed="0.005767"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.341225" elapsed="0.005811"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.348056" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.347604" elapsed="0.000481"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:15.348140" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.348294" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.347247" elapsed="0.001072"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.348471" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.349359" level="INFO">index=97
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.349073" elapsed="0.000416"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.349639" elapsed="0.002395"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.352473" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:15.353533" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.352208" elapsed="0.001713">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.364237" elapsed="0.000332"/>
</kw>
<msg time="2026-04-25T23:57:15.364627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.362913" elapsed="0.002145"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.365395" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.365676" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.354721" elapsed="0.011098"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.354195" elapsed="0.011673"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.338166" elapsed="0.027783">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.366285" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.366361" 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="FAIL" start="2026-04-25T23:57:15.322378" elapsed="0.044094">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:15.366578" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.366623" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.317704" elapsed="0.048942"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.366992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.366740" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.366721" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:15.317537" elapsed="0.049594"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:15.317362" elapsed="0.049800"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:15.314966" elapsed="0.052251"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:15.309793" elapsed="0.057480"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.309326" elapsed="0.057992"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:15.306374" elapsed="0.060997"/>
</kw>
<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-04-25T23:57:15.378585" 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-04-25T23:57:15.376305" elapsed="0.002308"/>
</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-04-25T23:57:15.378953" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:15.378801" elapsed="0.000209"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.378680" elapsed="0.000355"/>
</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-04-25T23:57:15.379336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.379098" 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-04-25T23:57:15.380177" level="INFO">${uri} = /restconf/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-04-25T23:57:15.379697" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.379416" elapsed="0.000824"/>
</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-04-25T23:57:15.380443" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.380265" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.379081" elapsed="0.001440"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.380564" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:57:15.380742" level="INFO">${uri} = /restconf/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-04-25T23:57:15.375848" elapsed="0.004920"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.380815" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:15.380959" level="INFO">${uri} = /restconf/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-04-25T23:57:15.375311" elapsed="0.005672"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.388646" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.388394" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.389114" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.388870" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:15.393724" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.391322" elapsed="0.004037">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.389224" elapsed="0.006233">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.395640" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.395492" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.389206" elapsed="0.006539">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.396165" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.396297" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.396261" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.396245" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.396495" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.396563" 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-04-25T23:57:15.383719" elapsed="0.012962">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.396754" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:15.381200" elapsed="0.015657">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.397025" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:15.397186" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.397249" elapsed="0.000014"/>
</return>
<var>${count}</var>
<arg>${DEVICE_NAME}</arg>
<doc>Count all instances of the specified device in the Netconf topology (usually 0 or 1).</doc>
<status status="FAIL" start="2026-04-25T23:57:15.367665" elapsed="0.029678">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>1</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.397500" elapsed="0.000021"/>
</kw>
<doc>Get the list of configured devices and search for our device there. Fail if not found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:15.305744" elapsed="0.091923">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t4" name="Wait_For_Device_To_Become_Connected" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:15.401127" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:15.400847" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.402394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.402283" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.402265" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.407464" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.407342" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.407324" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.408544" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:15.408160" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.409062" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:15.408750" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:15.409133" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:15.409291" 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-04-25T23:57:15.407772" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.414945" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.414837" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.414818" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.416305" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.416196" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.416177" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.416901" level="INFO">${karaf_connection_index} = 97</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.416516" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.417353" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.417087" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.418359" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.417949" elapsed="0.001298">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.419440" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:15.419487" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.417541" elapsed="0.001971"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.420383" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.420098" elapsed="0.001339">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:15.421613" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:15.421680" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.419694" elapsed="0.002011"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.422613" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.422004" elapsed="0.000725">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.421785" elapsed="0.001039">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.421761" elapsed="0.001097">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.423017" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.423254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.423105" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.423088" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.423386" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.426417" elapsed="0.000165"/>
</kw>
<msg time="2026-04-25T23:57:15.426755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.425756" elapsed="0.001101"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.427800" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.428785" 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-04-25T23:57:15.424282" elapsed="0.004620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.423690" elapsed="0.005327"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.415877" elapsed="0.013224">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</status>
</kw>
<msg time="2026-04-25T23:57:15.429203" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.429247" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Wait_For_Device_To_Become_Connected"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.415210" elapsed="0.014062"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.429500" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.429357" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.429338" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.430384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.430268" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.430250" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.430740" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.430845" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:15.430601" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.431277" level="INFO">{1: 97}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.431020" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.431864" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.431578" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.432432" elapsed="0.000434"/>
</kw>
<msg time="2026-04-25T23:57:15.432973" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:15.433020" level="INFO">${old_connection_index} = 97</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.432065" elapsed="0.000979"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.433878" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.437498" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.437061" elapsed="0.001027">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.434280" elapsed="0.003886"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.439705" elapsed="0.000373"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.438408" elapsed="0.001735"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:15.433342" elapsed="0.006906"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.433121" elapsed="0.007177"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.433102" elapsed="0.007223"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:15.441300" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.440890" elapsed="0.000438"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:15.441377" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:15.441543" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.440535" elapsed="0.001036"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:15.441739" elapsed="0.000404"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.442418" level="INFO">index=98
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:15.442307" 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-04-25T23:57:15.442720" elapsed="0.002284"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:15.445425" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:15.446404" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.445165" elapsed="0.001630">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:15.457109" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:57:15.457520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:15.455865" elapsed="0.001745"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.458273" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.458532" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:15.447607" elapsed="0.011081"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:15.447068" elapsed="0.011669"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.429971" elapsed="0.028848">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.459150" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.459224" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.414479" elapsed="0.044848">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:15.459443" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:15.459489" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.409697" elapsed="0.049815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.459853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.459588" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.459569" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:15.409542" elapsed="0.050410"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:15.409369" elapsed="0.050612"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:15.406974" elapsed="0.053060"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:15.401994" elapsed="0.058094"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:15.401544" elapsed="0.058587"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:15.398421" elapsed="0.061760"/>
</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-04-25T23:57:15.472477" 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-04-25T23:57:15.470339" elapsed="0.002166"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.473194" 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-04-25T23:57:15.472871" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:15.472718" elapsed="0.000538"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.473815" 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-04-25T23:57:15.473483" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:15.473336" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:15.472564" elapsed="0.001341"/>
</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-04-25T23:57:15.474212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.473971" 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-04-25T23:57:15.475002" level="INFO">${uri} = /restconf/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-04-25T23:57:15.474519" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:15.474292" 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-04-25T23:57:15.475300" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.475136" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:15.473953" elapsed="0.001422"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.475422" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:15.475574" level="INFO">${uri} = /restconf/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-04-25T23:57:15.469815" elapsed="0.005785"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:15.475660" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:15.475808" level="INFO">${uri} = /restconf/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-04-25T23:57:15.469197" 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-04-25T23:57:15.483128" level="INFO">/restconf/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-04-25T23:57:15.482875" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:15.483576" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:15.483323" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:15.488502" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.485767" elapsed="0.004402">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:15.483704" elapsed="0.006547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.490436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:15.490285" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:15.483684" elapsed="0.006838">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.490911" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.491044" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:15.491008" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:15.490991" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:15.491245" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.491312" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.478511" elapsed="0.012918">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:15.491500" 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-04-25T23:57:15.476056" elapsed="0.015538">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:15.491776" 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-04-25T23:57:15.461361" elapsed="0.030558">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:16.510246" 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-04-25T23:57:16.508081" elapsed="0.002198"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:16.511000" 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-04-25T23:57:16.510642" elapsed="0.000386"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:16.510487" elapsed="0.000577"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:16.511616" 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-04-25T23:57:16.511294" elapsed="0.000349"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:16.511144" elapsed="0.000550"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:16.510345" 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-04-25T23:57:16.512054" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:16.511794" 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-04-25T23:57:16.512853" level="INFO">${uri} = /restconf/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-04-25T23:57:16.512363" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:16.512135" 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-04-25T23:57:16.513106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:16.512944" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:16.511775" elapsed="0.001408"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:16.513219" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:16.513377" level="INFO">${uri} = /restconf/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-04-25T23:57:16.507584" elapsed="0.005820"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:16.513451" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:16.513595" level="INFO">${uri} = /restconf/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-04-25T23:57:16.507006" elapsed="0.006615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:16.521119" level="INFO">/restconf/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-04-25T23:57:16.520855" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:16.521557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:16.521316" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:16.526455" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:16.523773" elapsed="0.004383">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:16.521682" elapsed="0.006558">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:16.528426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:16.528275" elapsed="0.000269"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:16.521662" elapsed="0.006908">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:16.528967" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:16.529100" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:16.529063" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:16.529046" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:16.529304" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:16.529374" 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-04-25T23:57:16.516437" elapsed="0.013041">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:16.529550" 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-04-25T23:57:16.513862" elapsed="0.015783">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:16.529829" 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-04-25T23:57:16.492791" elapsed="0.037148">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:17.547476" 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-04-25T23:57:17.544537" elapsed="0.002967"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:17.548199" 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-04-25T23:57:17.547870" elapsed="0.000356"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:17.547711" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:17.548823" 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-04-25T23:57:17.548489" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:17.548340" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:17.547559" 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-04-25T23:57:17.549227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:17.548987" 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-04-25T23:57:17.550019" level="INFO">${uri} = /restconf/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-04-25T23:57:17.549534" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:17.549306" 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-04-25T23:57:17.550268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:17.550108" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:17.548968" elapsed="0.001375"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:17.550377" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:57:17.550548" level="INFO">${uri} = /restconf/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-04-25T23:57:17.543905" elapsed="0.006669"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:17.550671" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:17.550823" level="INFO">${uri} = /restconf/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-04-25T23:57:17.543112" elapsed="0.007737"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:17.558182" level="INFO">/restconf/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-04-25T23:57:17.557931" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:17.558632" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:17.558389" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:17.563237" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:17.560823" elapsed="0.004069">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:17.558759" elapsed="0.006216">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:17.565161" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:17.565009" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:17.558740" elapsed="0.006509">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:17.565614" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:17.565763" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:17.565726" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:17.565708" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:17.565980" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:17.566065" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:17.553543" elapsed="0.012626">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:17.566240" 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-04-25T23:57:17.551072" elapsed="0.015264">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:17.566542" 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-04-25T23:57:17.530580" elapsed="0.036095">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:18.584824" 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-04-25T23:57:18.582706" elapsed="0.002146"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:18.585518" 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-04-25T23:57:18.585192" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:18.585042" elapsed="0.000539"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:18.586165" 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-04-25T23:57:18.585828" elapsed="0.000363"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:18.585678" elapsed="0.000548"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:18.584908" 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-04-25T23:57:18.586561" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:18.586320" 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-04-25T23:57:18.587358" level="INFO">${uri} = /restconf/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-04-25T23:57:18.586889" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:18.586642" 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-04-25T23:57:18.587608" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:18.587447" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:18.586301" elapsed="0.001398"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:18.587733" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:18.587883" level="INFO">${uri} = /restconf/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-04-25T23:57:18.582191" elapsed="0.005718"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:18.587956" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:18.588098" level="INFO">${uri} = /restconf/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-04-25T23:57:18.581612" 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-04-25T23:57:18.595436" level="INFO">/restconf/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-04-25T23:57:18.595186" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:18.595890" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:18.595633" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:18.600821" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:18.598202" elapsed="0.004239">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:18.595999" elapsed="0.006524">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:18.602725" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:18.602556" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:18.595981" elapsed="0.006833">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:18.603179" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:18.603346" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:18.603308" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:18.603290" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:18.603549" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:18.603619" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:18.590838" elapsed="0.012902">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:18.603812" 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-04-25T23:57:18.588343" elapsed="0.015564">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:18.604108" 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-04-25T23:57:18.567788" elapsed="0.036429">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:19.623290" 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-04-25T23:57:19.621035" elapsed="0.002284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:19.624009" 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-04-25T23:57:19.623677" elapsed="0.000359"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:19.623509" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:19.624625" 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-04-25T23:57:19.624303" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:19.624154" elapsed="0.000549"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:19.623375" 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-04-25T23:57:19.625039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:19.624798" 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-04-25T23:57:19.625844" level="INFO">${uri} = /restconf/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-04-25T23:57:19.625348" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:19.625120" 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-04-25T23:57:19.626095" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:19.625933" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:19.624780" elapsed="0.001390"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:19.626203" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:19.626351" level="INFO">${uri} = /restconf/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-04-25T23:57:19.620561" elapsed="0.005815"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:19.626422" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:19.626563" level="INFO">${uri} = /restconf/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-04-25T23:57:19.619975" elapsed="0.006613"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:19.633967" level="INFO">/restconf/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-04-25T23:57:19.633708" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:19.634405" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:19.634163" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:19.639214" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:19.636578" elapsed="0.004292">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:19.634515" elapsed="0.006437">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:19.641138" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:19.640987" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:19.634497" elapsed="0.006728">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:19.641604" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:19.641752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:19.641715" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:19.641697" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:19.641953" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:19.642022" 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-04-25T23:57:19.629326" elapsed="0.012803">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:19.642201" 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-04-25T23:57:19.626822" elapsed="0.015473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:19.642462" 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-04-25T23:57:19.604926" elapsed="0.037644">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:20.662900" 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-04-25T23:57:20.660744" elapsed="0.002188"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:20.663621" 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-04-25T23:57:20.663294" elapsed="0.000368"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:20.663139" elapsed="0.000561"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:20.664335" 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-04-25T23:57:20.664010" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:20.663859" elapsed="0.000539"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:20.662998" elapsed="0.001430"/>
</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-04-25T23:57:20.664770" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:20.664496" 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-04-25T23:57:20.665558" level="INFO">${uri} = /restconf/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-04-25T23:57:20.665089" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:20.664851" 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-04-25T23:57:20.665824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:20.665661" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:20.664477" elapsed="0.001423"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:20.665937" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:20.666094" level="INFO">${uri} = /restconf/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-04-25T23:57:20.660249" elapsed="0.005872"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:20.666168" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:20.666312" level="INFO">${uri} = /restconf/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-04-25T23:57:20.659646" 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-04-25T23:57:20.673642" level="INFO">/restconf/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-04-25T23:57:20.673384" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:20.674099" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:20.673856" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:20.679221" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:20.676259" elapsed="0.004669">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:20.674208" elapsed="0.006804">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:20.681198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:20.681047" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:20.674190" elapsed="0.007095">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:20.681672" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:20.681808" elapsed="0.000170"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:20.681771" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:20.681755" elapsed="0.000276"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:20.682177" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:20.682249" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:20.669053" elapsed="0.013335">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:20.682461" 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-04-25T23:57:20.666560" elapsed="0.015996">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:20.682747" 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-04-25T23:57:20.643399" elapsed="0.039460">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:21.700796" 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-04-25T23:57:21.697787" elapsed="0.003051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:21.701614" 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-04-25T23:57:21.701291" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:21.701132" elapsed="0.000559"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:21.702236" 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-04-25T23:57:21.701922" elapsed="0.000340"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:21.701773" elapsed="0.000524"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:21.700924" 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-04-25T23:57:21.702644" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:21.702394" 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-04-25T23:57:21.703438" level="INFO">${uri} = /restconf/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-04-25T23:57:21.702969" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:21.702740" 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-04-25T23:57:21.703700" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:21.703525" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:21.702375" elapsed="0.001400"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:21.703812" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:21.703971" level="INFO">${uri} = /restconf/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-04-25T23:57:21.697118" elapsed="0.006878"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:21.704042" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:21.704183" level="INFO">${uri} = /restconf/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-04-25T23:57:21.696299" elapsed="0.007909"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:21.712717" level="INFO">/restconf/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-04-25T23:57:21.712416" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:21.713169" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:21.712924" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:21.718200" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:21.715360" elapsed="0.004627">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:21.713284" elapsed="0.006788">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:21.720260" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:21.720107" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:21.713261" elapsed="0.007088">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:21.720775" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:21.720910" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:21.720872" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:21.720855" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:21.721118" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:21.721188" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:21.706973" elapsed="0.014320">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:21.721365" 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-04-25T23:57:21.704441" elapsed="0.017019">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:21.721628" elapsed="0.000235"/>
</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-04-25T23:57:21.683543" elapsed="0.038428">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:22.739425" 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-04-25T23:57:22.737181" elapsed="0.002279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:22.740208" 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-04-25T23:57:22.739847" elapsed="0.000391"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:22.739686" elapsed="0.000588"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:22.740840" 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-04-25T23:57:22.740506" elapsed="0.000360"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:22.740357" elapsed="0.000544"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:22.739524" 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-04-25T23:57:22.741236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:22.740994" 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-04-25T23:57:22.742083" level="INFO">${uri} = /restconf/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-04-25T23:57:22.741541" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:22.741315" elapsed="0.000833"/>
</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-04-25T23:57:22.742335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:22.742173" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:22.740976" elapsed="0.001433"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:22.742443" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:22.742592" level="INFO">${uri} = /restconf/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-04-25T23:57:22.736718" elapsed="0.005900"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:22.742679" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:22.742821" level="INFO">${uri} = /restconf/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-04-25T23:57:22.736154" 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-04-25T23:57:22.750108" level="INFO">/restconf/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-04-25T23:57:22.749857" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:22.750549" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:22.750309" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:22.755298" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:22.752747" elapsed="0.004194">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:22.750674" elapsed="0.006349">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:22.757212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:22.757056" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:22.750640" elapsed="0.006659">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:22.757677" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:22.757810" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:22.757773" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:22.757756" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:22.758010" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:22.758080" 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-04-25T23:57:22.745538" elapsed="0.012644">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:22.758252" 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-04-25T23:57:22.743066" elapsed="0.015280">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:22.758548" 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-04-25T23:57:22.722841" elapsed="0.035833">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:23.773455" 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-04-25T23:57:23.771294" elapsed="0.002193"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:23.774187" 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-04-25T23:57:23.773860" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:23.773707" elapsed="0.000544"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:23.774816" 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-04-25T23:57:23.774482" elapsed="0.000362"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:23.774332" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:23.773552" 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-04-25T23:57:23.775236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:23.774979" 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-04-25T23:57:23.776041" level="INFO">${uri} = /restconf/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-04-25T23:57:23.775557" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:23.775317" 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-04-25T23:57:23.776292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:23.776130" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:23.774959" elapsed="0.001407"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:23.776402" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:23.776558" level="INFO">${uri} = /restconf/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-04-25T23:57:23.770815" elapsed="0.005769"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:23.776630" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:57:23.776789" level="INFO">${uri} = /restconf/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-04-25T23:57:23.770224" elapsed="0.006591"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:23.784114" level="INFO">/restconf/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-04-25T23:57:23.783857" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:23.784556" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:23.784314" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:23.789259" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:23.786735" elapsed="0.004227">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:23.784682" elapsed="0.006363">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:23.791294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:23.791138" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:23.784662" elapsed="0.006736">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:23.791790" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:23.791924" elapsed="0.001696"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:23.791886" elapsed="0.001783"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:23.791869" elapsed="0.001824"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:23.793840" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:23.793913" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:23.779506" elapsed="0.014512">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:23.794090" 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-04-25T23:57:23.777036" elapsed="0.017154">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:23.794359" 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-04-25T23:57:23.759384" elapsed="0.035084">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:24.811608" 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-04-25T23:57:24.809358" elapsed="0.002287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:24.812386" 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-04-25T23:57:24.812056" elapsed="0.000357"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:24.811897" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:24.813017" 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-04-25T23:57:24.812697" elapsed="0.000346"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:24.812532" elapsed="0.000547"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:24.811741" 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-04-25T23:57:24.813465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:24.813192" 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-04-25T23:57:24.814262" level="INFO">${uri} = /restconf/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-04-25T23:57:24.813794" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:24.813547" 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-04-25T23:57:24.814514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:24.814351" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:24.813168" elapsed="0.001421"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:24.814631" elapsed="0.000060"/>
</return>
<msg time="2026-04-25T23:57:24.814931" level="INFO">${uri} = /restconf/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-04-25T23:57:24.808845" elapsed="0.006113"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:24.815007" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:24.815149" level="INFO">${uri} = /restconf/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-04-25T23:57:24.808219" elapsed="0.006955"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:24.822547" level="INFO">/restconf/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-04-25T23:57:24.822276" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:24.823203" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:24.822762" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:24.828374" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:24.825561" elapsed="0.004577">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:24.823320" elapsed="0.006912">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:24.830416" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:24.830266" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:24.823300" elapsed="0.007203">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:24.830924" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:24.831058" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:24.831022" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:24.831004" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:24.831280" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:24.831348" 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-04-25T23:57:24.817902" elapsed="0.013552">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:24.831524" 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-04-25T23:57:24.815400" elapsed="0.016218">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:24.831807" 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-04-25T23:57:24.795700" elapsed="0.036217">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:25.849625" 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-04-25T23:57:25.847424" elapsed="0.002250"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:25.850407" 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-04-25T23:57:25.850069" elapsed="0.000366"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:25.849913" elapsed="0.000558"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:25.851040" 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-04-25T23:57:25.850721" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:25.850557" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:25.849757" 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-04-25T23:57:25.851482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:25.851211" 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-04-25T23:57:25.852279" level="INFO">${uri} = /restconf/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-04-25T23:57:25.851812" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:25.851565" 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-04-25T23:57:25.852527" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:25.852366" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:25.851188" elapsed="0.001414"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:25.852644" elapsed="0.000058"/>
</return>
<msg time="2026-04-25T23:57:25.852832" level="INFO">${uri} = /restconf/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-04-25T23:57:25.846926" elapsed="0.005931"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:25.852905" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:25.853047" level="INFO">${uri} = /restconf/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-04-25T23:57:25.846302" elapsed="0.006770"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:25.860705" level="INFO">/restconf/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-04-25T23:57:25.860427" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:25.861148" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:25.860904" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:25.866092" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:25.863358" elapsed="0.004480">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:25.861257" elapsed="0.006668">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:25.868109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:25.867959" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:25.861238" elapsed="0.006957">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:25.868571" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:25.868778" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:25.868740" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:25.868722" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:25.868978" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:25.869047" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:25.856063" elapsed="0.013090">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:25.869224" 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-04-25T23:57:25.853298" elapsed="0.016021">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:25.869483" 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-04-25T23:57:25.832901" elapsed="0.036690">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:26.886824" 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-04-25T23:57:26.883862" elapsed="0.002991"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:26.887529" 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-04-25T23:57:26.887202" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:26.887049" elapsed="0.000542"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:26.888154" 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-04-25T23:57:26.887837" elapsed="0.000343"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:26.887686" elapsed="0.000532"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:26.886913" elapsed="0.001337"/>
</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-04-25T23:57:26.888559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:26.888314" 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-04-25T23:57:26.889366" level="INFO">${uri} = /restconf/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-04-25T23:57:26.888897" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:26.888647" 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-04-25T23:57:26.889624" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:26.889460" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:26.888296" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:26.889758" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:26.889922" level="INFO">${uri} = /restconf/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-04-25T23:57:26.883207" elapsed="0.006742"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:26.889995" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:26.890151" level="INFO">${uri} = /restconf/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-04-25T23:57:26.882404" elapsed="0.007772"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:26.897598" level="INFO">/restconf/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-04-25T23:57:26.897346" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:26.898115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:26.897811" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:26.902864" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:26.900298" elapsed="0.004186">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:26.898226" elapsed="0.006340">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:26.904771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:26.904601" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:26.898207" elapsed="0.006652">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:26.905233" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:26.905363" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:26.905326" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:26.905310" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:26.905562" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:26.905630" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:26.892992" elapsed="0.012760">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:26.905824" 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-04-25T23:57:26.890398" elapsed="0.015552">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:26.906123" 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-04-25T23:57:26.870220" elapsed="0.036011">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:27.926713" 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-04-25T23:57:27.924493" elapsed="0.002253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:27.927449" 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-04-25T23:57:27.927121" elapsed="0.000354"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:27.926967" elapsed="0.000545"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:27.928145" 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-04-25T23:57:27.927824" elapsed="0.000348"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:27.927671" elapsed="0.000536"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:27.926818" elapsed="0.001417"/>
</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-04-25T23:57:27.928576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:27.928316" 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-04-25T23:57:27.929401" level="INFO">${uri} = /restconf/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-04-25T23:57:27.928921" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:27.928673" 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-04-25T23:57:27.929674" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:27.929492" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:27.928293" elapsed="0.001460"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:27.929793" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:57:27.929960" level="INFO">${uri} = /restconf/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-04-25T23:57:27.924010" elapsed="0.005976"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:27.930033" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:27.930177" level="INFO">${uri} = /restconf/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-04-25T23:57:27.923407" 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-04-25T23:57:27.937777" level="INFO">/restconf/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-04-25T23:57:27.937499" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:27.938216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:27.937973" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:27.943157" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:27.940402" elapsed="0.004443">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:27.938330" elapsed="0.006600">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:27.945115" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:27.944965" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:27.938311" elapsed="0.006890">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:27.945591" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:27.945739" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:27.945703" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:27.945685" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:27.945938" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:27.946005" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:27.932919" elapsed="0.013226">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:27.946217" 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-04-25T23:57:27.930424" elapsed="0.015893">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:27.946483" 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-04-25T23:57:27.907041" elapsed="0.039549">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:28.966031" 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-04-25T23:57:28.963886" elapsed="0.002174"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:28.966746" 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-04-25T23:57:28.966406" elapsed="0.000366"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:28.966252" elapsed="0.000556"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:28.967349" 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-04-25T23:57:28.967035" elapsed="0.000340"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:28.966887" elapsed="0.000522"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:28.966118" elapsed="0.001320"/>
</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-04-25T23:57:28.967758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:28.967501" 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-04-25T23:57:28.968531" level="INFO">${uri} = /restconf/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-04-25T23:57:28.968070" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:28.967840" elapsed="0.000753"/>
</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-04-25T23:57:28.968792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:28.968617" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:28.967483" elapsed="0.001383"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:28.968910" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:28.969064" level="INFO">${uri} = /restconf/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-04-25T23:57:28.963412" elapsed="0.005677"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:28.969134" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:28.969275" level="INFO">${uri} = /restconf/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-04-25T23:57:28.962847" elapsed="0.006452"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:28.976660" level="INFO">/restconf/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-04-25T23:57:28.976399" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:28.977312" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:28.976859" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:28.982082" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:28.979542" elapsed="0.004249">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:28.977446" elapsed="0.006428">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:28.984060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:28.983909" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:28.977424" elapsed="0.006723">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:28.984513" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:28.984644" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:28.984608" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:28.984592" elapsed="0.000133"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:28.984864" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:28.984946" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:28.972042" elapsed="0.013009">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:28.985121" 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-04-25T23:57:28.969519" elapsed="0.015697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:28.985385" 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-04-25T23:57:28.947238" elapsed="0.038256">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:30.005551" 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-04-25T23:57:30.002590" elapsed="0.003007"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:30.006544" 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-04-25T23:57:30.006116" elapsed="0.000465"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:30.005908" elapsed="0.000721"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:30.007383" 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-04-25T23:57:30.006959" elapsed="0.000460"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:30.006759" elapsed="0.000705"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:30.005712" elapsed="0.001791"/>
</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-04-25T23:57:30.007983" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:30.007609" elapsed="0.000451"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:30.009144" level="INFO">${uri} = /restconf/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-04-25T23:57:30.008421" elapsed="0.000761"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:30.008095" elapsed="0.001133"/>
</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-04-25T23:57:30.009480" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:30.009262" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:30.007577" elapsed="0.002006"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:30.009636" elapsed="0.000072"/>
</return>
<msg time="2026-04-25T23:57:30.009876" level="INFO">${uri} = /restconf/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-04-25T23:57:30.001950" elapsed="0.007961"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:30.009974" elapsed="0.000035"/>
</return>
<msg time="2026-04-25T23:57:30.010161" level="INFO">${uri} = /restconf/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-04-25T23:57:30.001104" elapsed="0.009091"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:30.017942" level="INFO">/restconf/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-04-25T23:57:30.017678" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:30.018389" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:30.018141" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:30.023444" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:30.020736" elapsed="0.004473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:30.018498" elapsed="0.006804">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:30.025486" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:30.025336" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:30.018480" elapsed="0.007093">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:30.025970" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:30.026102" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:30.026065" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:30.026049" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:30.026305" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:30.026374" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:30.013168" elapsed="0.013313">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:30.026552" 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-04-25T23:57:30.010494" elapsed="0.016152">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:30.026865" 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-04-25T23:57:29.987482" elapsed="0.039495">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:31.044565" 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-04-25T23:57:31.041610" elapsed="0.002988"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:31.045307" 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-04-25T23:57:31.044981" elapsed="0.000353"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:31.044827" elapsed="0.000544"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:31.046046" 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-04-25T23:57:31.045721" elapsed="0.000352"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:31.045450" elapsed="0.000659"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:31.044681" elapsed="0.001458"/>
</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-04-25T23:57:31.046473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:31.046211" 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-04-25T23:57:31.047267" level="INFO">${uri} = /restconf/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-04-25T23:57:31.046799" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:31.046554" 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-04-25T23:57:31.047517" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:31.047355" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:31.046191" elapsed="0.001400"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:31.047628" elapsed="0.000049"/>
</return>
<msg time="2026-04-25T23:57:31.047804" level="INFO">${uri} = /restconf/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-04-25T23:57:31.040953" elapsed="0.006877"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:31.047876" elapsed="0.000042"/>
</return>
<msg time="2026-04-25T23:57:31.048040" level="INFO">${uri} = /restconf/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-04-25T23:57:31.040143" elapsed="0.007922"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:31.055594" level="INFO">/restconf/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-04-25T23:57:31.055336" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:31.056130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:31.055864" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:31.061091" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:31.058320" elapsed="0.004473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:31.056241" elapsed="0.006637">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:31.063119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:31.062965" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:31.056222" elapsed="0.006985">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:31.063578" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:31.063726" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:31.063689" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:31.063671" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:31.063962" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:31.064039" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:31.050987" elapsed="0.013158">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:31.064216" 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-04-25T23:57:31.048285" elapsed="0.016027">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:31.064478" 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-04-25T23:57:31.027759" elapsed="0.036833">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:32.084854" 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-04-25T23:57:32.082448" elapsed="0.002440"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:32.085587" 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-04-25T23:57:32.085264" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:32.085110" elapsed="0.000553"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:32.086211" 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-04-25T23:57:32.085895" elapsed="0.000342"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:32.085746" elapsed="0.000526"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:32.084961" 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-04-25T23:57:32.086635" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:32.086375" 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-04-25T23:57:32.087440" level="INFO">${uri} = /restconf/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-04-25T23:57:32.086962" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:32.086732" 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-04-25T23:57:32.087709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:32.087533" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:32.086353" elapsed="0.001433"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:32.087823" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:57:32.088045" level="INFO">${uri} = /restconf/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-04-25T23:57:32.081963" elapsed="0.006108"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:32.088120" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:32.088264" level="INFO">${uri} = /restconf/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-04-25T23:57:32.081365" elapsed="0.006924"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:32.095591" level="INFO">/restconf/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-04-25T23:57:32.095323" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:32.096043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:32.095802" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:32.101232" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:32.098213" elapsed="0.006768">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:32.096152" elapsed="0.009014">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:32.105585" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:32.105243" elapsed="0.000515"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:32.096134" elapsed="0.009677">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:32.106617" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:32.106944" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:32.106862" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:32.106825" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:32.107404" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:32.107558" 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-04-25T23:57:32.090973" elapsed="0.016853">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:32.107984" 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-04-25T23:57:32.088510" elapsed="0.019685">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:32.108562" elapsed="0.000046"/>
</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-04-25T23:57:32.065417" elapsed="0.043412">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:33.125330" 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-04-25T23:57:33.123099" elapsed="0.002266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:33.126092" 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-04-25T23:57:33.125758" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:33.125588" elapsed="0.000566"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:33.126712" 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-04-25T23:57:33.126381" elapsed="0.000358"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:33.126234" elapsed="0.000540"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:33.125441" 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-04-25T23:57:33.127155" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:33.126879" 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-04-25T23:57:33.127942" level="INFO">${uri} = /restconf/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-04-25T23:57:33.127464" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:33.127236" 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-04-25T23:57:33.128191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:33.128030" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:33.126857" elapsed="0.001409"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:33.128303" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:57:33.128474" level="INFO">${uri} = /restconf/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-04-25T23:57:33.122389" elapsed="0.006111"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:33.128547" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:33.128705" level="INFO">${uri} = /restconf/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-04-25T23:57:33.121572" elapsed="0.007159"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:33.136073" level="INFO">/restconf/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-04-25T23:57:33.135815" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:33.136505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:33.136267" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:33.141390" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:33.138685" elapsed="0.004492">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:33.136614" elapsed="0.006650">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:33.143454" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:33.143298" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:33.136595" elapsed="0.006965">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:33.143958" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:33.144152" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:33.144114" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:33.144097" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:33.144352" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:33.144422" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:33.131443" elapsed="0.013085">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:33.144598" 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-04-25T23:57:33.128954" elapsed="0.015757">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:33.144879" 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-04-25T23:57:33.109787" elapsed="0.035200">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:34.163594" 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-04-25T23:57:34.161411" elapsed="0.002215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:34.164327" 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-04-25T23:57:34.164004" elapsed="0.000350"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:34.163851" elapsed="0.000538"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:34.164952" 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-04-25T23:57:34.164619" elapsed="0.000359"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:34.164470" elapsed="0.000543"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:34.163709" elapsed="0.001332"/>
</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-04-25T23:57:34.165371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:34.165111" 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-04-25T23:57:34.166160" level="INFO">${uri} = /restconf/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-04-25T23:57:34.165695" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:34.165453" 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-04-25T23:57:34.166431" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:34.166248" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:34.165090" elapsed="0.001421"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:34.166547" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:57:34.166733" level="INFO">${uri} = /restconf/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-04-25T23:57:34.160926" elapsed="0.005834"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:34.166808" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:34.166950" level="INFO">${uri} = /restconf/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-04-25T23:57:34.160323" elapsed="0.006652"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:34.174398" level="INFO">/restconf/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-04-25T23:57:34.174136" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:34.174855" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:34.174596" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:34.181369" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:34.178835" elapsed="0.004276">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:34.174965" elapsed="0.008233">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:34.183383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:34.183232" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:34.174946" elapsed="0.008523">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:34.183854" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:34.183984" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:34.183948" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:34.183931" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:34.184182" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:34.184250" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:34.169766" elapsed="0.014588">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:34.184424" 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-04-25T23:57:34.167199" elapsed="0.017320">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:34.184699" 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-04-25T23:57:34.145702" elapsed="0.039106">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:35.202803" 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-04-25T23:57:35.199755" elapsed="0.003080"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:35.203533" 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-04-25T23:57:35.203199" elapsed="0.000362"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:35.203045" elapsed="0.000551"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:35.204265" 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-04-25T23:57:35.203939" elapsed="0.000353"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:35.203788" elapsed="0.000539"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:35.202901" elapsed="0.001455"/>
</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-04-25T23:57:35.204703" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:35.204428" 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-04-25T23:57:35.205506" level="INFO">${uri} = /restconf/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-04-25T23:57:35.205022" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:35.204786" 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-04-25T23:57:35.205779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:35.205597" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:35.204408" elapsed="0.001451"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:35.205920" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:57:35.206090" level="INFO">${uri} = /restconf/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-04-25T23:57:35.199054" elapsed="0.007063"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:35.206164" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:35.206311" level="INFO">${uri} = /restconf/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-04-25T23:57:35.198201" elapsed="0.008136"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:35.214008" level="INFO">/restconf/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-04-25T23:57:35.213690" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:35.214466" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:35.214217" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:35.219360" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:35.216632" elapsed="0.004400">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:35.214578" elapsed="0.006537">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:35.221301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:35.221150" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:35.214559" elapsed="0.006829">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:35.221773" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:35.221923" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:35.221869" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:35.221852" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:35.222128" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:35.222200" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:35.209274" elapsed="0.013064">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:35.222411" 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-04-25T23:57:35.206567" elapsed="0.015945">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:35.222701" 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-04-25T23:57:35.185725" elapsed="0.037087">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:36.234280" 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-04-25T23:57:36.232012" elapsed="0.002297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.235003" 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-04-25T23:57:36.234670" elapsed="0.000361"/>
</kw>
<var name="${nv}">topology=topology-netconf</var>
<status status="PASS" start="2026-04-25T23:57:36.234502" elapsed="0.000564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.235613" 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-04-25T23:57:36.235295" elapsed="0.000345"/>
</kw>
<var name="${nv}">node=netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:36.235145" elapsed="0.000545"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="PASS" start="2026-04-25T23:57:36.234364" 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-04-25T23:57:36.236026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.235785" 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-04-25T23:57:36.236826" level="INFO">${uri} = /restconf/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-04-25T23:57:36.236335" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.236107" 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-04-25T23:57:36.237081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.236916" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.235767" elapsed="0.001389"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:36.237189" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:36.237338" level="INFO">${uri} = /restconf/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-04-25T23:57:36.231541" elapsed="0.005823"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:36.237423" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:36.237572" level="INFO">${uri} = /restconf/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-04-25T23:57:36.230981" elapsed="0.006617"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.244956" level="INFO">/restconf/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-04-25T23:57:36.244705" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.245417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.245154" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:36.250454" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.247591" elapsed="0.004523">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.245529" elapsed="0.006666">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.252381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.252230" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.245511" elapsed="0.006956">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.252850" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.252982" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.252946" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.252929" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.253181" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.253249" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.240314" elapsed="0.013040">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.253455" 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-04-25T23:57:36.237834" elapsed="0.015718">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:36.253734" 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-04-25T23:57:36.223354" elapsed="0.030490">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:57:36.253940" level="FAIL">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:15.460808" elapsed="20.793226">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${DEVICE_NAME}</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-04-25T23:57:15.460389" elapsed="20.793754">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:57:15.397931" elapsed="20.856386">Keyword 'Check_Device_Connected' failed after retrying for 20 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t5" name="Check_Device_Data_Is_Empty" line="68">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:36.257707" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:36.257427" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.259123" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.259012" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.258993" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.264156" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.264051" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.264033" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.265220" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.264837" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.265739" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:36.265425" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:36.265810" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.265965" 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-04-25T23:57:36.264444" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.271650" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.271542" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.271523" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.272980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.272872" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.272854" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.273570" level="INFO">${karaf_connection_index} = 98</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.273192" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.274030" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.273775" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.275030" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.274602" elapsed="0.001341">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.276127" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:36.276174" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.274214" elapsed="0.001984"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.277083" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.276800" elapsed="0.001357">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.278335" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:36.278380" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.276366" elapsed="0.002038"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.279347" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.278730" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.278481" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.278460" elapsed="0.001100">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.279735" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.280024" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.279822" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.279805" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.280158" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.283164" elapsed="0.000149"/>
</kw>
<msg time="2026-04-25T23:57:36.283386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.282538" elapsed="0.000944"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.284431" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.285475" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.281023" elapsed="0.004572"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.280420" elapsed="0.005395"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.272545" elapsed="0.013357">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</status>
</kw>
<msg time="2026-04-25T23:57:36.286006" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.286050" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Data_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.271886" elapsed="0.014188"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.286261" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.286152" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.286132" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.287144" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.287040" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.287022" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.287493" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.287598" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.287361" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.288078" level="INFO">{1: 98}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.287821" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.288514" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.288272" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.289177" elapsed="0.000342"/>
</kw>
<msg time="2026-04-25T23:57:36.289619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:36.289682" level="INFO">${old_connection_index} = 98</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.288818" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.290519" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.292930" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.292332" elapsed="0.001149">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.290939" elapsed="0.002619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.295054" 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-04-25T23:57:36.293809" elapsed="0.001666"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:36.290002" elapsed="0.005577"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.289783" elapsed="0.005848"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.289764" elapsed="0.005943"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.296665" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.296244" elapsed="0.000450"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:36.296743" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:36.296896" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.295919" 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-04-25T23:57:36.297074" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.297797" level="INFO">index=99
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.297684" 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-04-25T23:57:36.298070" elapsed="0.002298"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.300806" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:36.301783" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.300528" elapsed="0.001625">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.312404" elapsed="0.000337"/>
</kw>
<msg time="2026-04-25T23:57:36.312799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.311108" elapsed="0.001779"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.313214" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.313484" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.302948" elapsed="0.010702"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.302421" elapsed="0.011598"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.286747" elapsed="0.027355">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.314435" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.314507" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.271205" elapsed="0.043407">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:36.314733" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.314777" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.266353" elapsed="0.048446"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.315123" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.314875" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.314857" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:36.266212" elapsed="0.049010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:36.266042" elapsed="0.049209"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:36.263690" elapsed="0.051615"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:36.258568" elapsed="0.056791"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.258134" elapsed="0.057271"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:36.255062" elapsed="0.060439"/>
</kw>
<kw name="Regexp Escape" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.315994" level="INFO">${escaped} = urn:ietf:params:xml:ns:netconf:base:1\.0</msg>
<var>${escaped}</var>
<arg>${ODL_NETCONF_NAMESPACE}</arg>
<doc>Returns each argument escaped for use as a regular expression.</doc>
<status status="PASS" start="2026-04-25T23:57:36.315673" elapsed="0.000347"/>
</kw>
<kw name="Check_Config_Data">
<kw name="Get_Config_Data">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.317313" level="INFO">${url} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<var>${url}</var>
<arg>${REST_API}/network-topology:network-topology/topology=topology-netconf/node=${DEVICE_NAME}/yang-ext:mount?content=config</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.316934" 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-04-25T23:57:36.325031" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.324781" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.325484" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.325227" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:36.330072" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.327681" elapsed="0.004014">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.325593" elapsed="0.006183">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.331959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.331810" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.325575" elapsed="0.006471">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.332411" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.332543" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.332506" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.332489" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.332760" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.332831" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.320199" elapsed="0.012737">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.333006" elapsed="0.000016"/>
</return>
<var>${data}</var>
<arg>${url}</arg>
<doc>Specify XML headers and return Get_From_Uri response text.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.317559" elapsed="0.015544">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${data}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.333158" elapsed="0.000015"/>
</return>
<var>${data}</var>
<doc>Get and return the config data from the device.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.316671" elapsed="0.016578">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${regex}">
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.333532" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.333383" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${contains}">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.333766" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.333611" elapsed="0.000209"/>
</branch>
<branch type="ELSE">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data}</arg>
<arg>${expected}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.333978" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.333843" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.333339" elapsed="0.000712"/>
</if>
<arg>&lt;data xmlns\="${escaped}"(\/&gt;|&gt;&lt;\/data&gt;)</arg>
<arg>${True}</arg>
<status status="FAIL" start="2026-04-25T23:57:36.316228" elapsed="0.017902">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.254575" elapsed="0.079695">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t6" name="Invoke_Yang1.1_Action_Via_Xml_Post" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:36.337644" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:36.337315" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.338901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.338792" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.338774" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.344094" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.343989" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.343971" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.345153" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.344773" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.345673" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:36.345337" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:36.345745" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.345901" 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-04-25T23:57:36.344380" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.351367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.351258" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.351240" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.352637" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.352530" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.352512" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.353228" level="INFO">${karaf_connection_index} = 99</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.352872" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.353688" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.353422" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.354528" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.354265" elapsed="0.001142">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.355584" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:36.355630" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.353876" elapsed="0.001791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.356539" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.356226" elapsed="0.001344">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.357773" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:36.357820" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.355837" elapsed="0.002006"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.358899" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.358136" elapsed="0.000844">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.357919" elapsed="0.001156">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.357899" elapsed="0.001212">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.359272" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.359501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.359359" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.359342" elapsed="0.000256"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.359631" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.362606" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:57:36.362847" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.361968" elapsed="0.000974"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.363859" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.364800" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.360483" elapsed="0.004432"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.359905" elapsed="0.005125"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.352224" elapsed="0.012891">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</status>
</kw>
<msg time="2026-04-25T23:57:36.365218" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.365261" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Xml_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.351584" elapsed="0.013701"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.365481" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.365373" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.365354" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.366442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.366338" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.366320" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.366795" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.366897" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.366676" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.367344" level="INFO">{1: 99}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.367087" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.367795" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.367535" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.368346" elapsed="0.000334"/>
</kw>
<msg time="2026-04-25T23:57:36.368781" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:36.368869" level="INFO">${old_connection_index} = 99</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.367993" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.369832" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.371953" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.371517" elapsed="0.001088">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.370239" elapsed="0.002463"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.374336" elapsed="0.000375"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.372942" elapsed="0.001833"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:36.369190" elapsed="0.005689"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.368972" elapsed="0.005959"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.368953" elapsed="0.006003"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.375901" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.375479" elapsed="0.000450"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:36.375976" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.376127" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.375157" elapsed="0.000994"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.376302" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.377168" level="INFO">index=100
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.376891" elapsed="0.000408"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.377459" elapsed="0.002258"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.380162" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:36.381042" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.379876" elapsed="0.001547">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.391820" elapsed="0.000320"/>
</kw>
<msg time="2026-04-25T23:57:36.392198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.390493" 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-04-25T23:57:36.392615" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.392890" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.382345" elapsed="0.010686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.381836" elapsed="0.011244"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.366046" elapsed="0.027116">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.393508" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.393582" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.350919" elapsed="0.043047">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:36.394112" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.394156" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.346290" elapsed="0.047890"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.394509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.394258" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.394239" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:36.346150" elapsed="0.048460"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:36.345978" elapsed="0.048662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:36.343617" elapsed="0.051094"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:36.338490" elapsed="0.056277"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.338075" elapsed="0.056737"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:36.335159" elapsed="0.059706"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.395454" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:57:36.395029" elapsed="0.000451"/>
</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-04-25T23:57:36.429534" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.429137" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.430321" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.430079" elapsed="0.000304">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.430476" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.429738" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.431058" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.430675" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.431375" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.431527" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/example-action:interfaces/interface=eth1/reset
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.431241" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.431965" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/example-action:interfaces/interface=eth1/reset
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.431719" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.432956" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.432702" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.433436" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.433154" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.434118" 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-04-25T23:57:36.433823" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.434890" 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-04-25T23:57:36.434635" elapsed="0.000312"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.435000" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:36.435153" 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-04-25T23:57:36.434325" elapsed="0.000852"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.435326" elapsed="0.000225"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:36.433692" elapsed="0.001900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.436153" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:36.435858" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.436918" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.436685" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.436993" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.437142" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:36.436359" elapsed="0.000807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.437323" elapsed="0.000221"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:36.435726" elapsed="0.001858"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.433509" elapsed="0.004109"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.437675" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.437833" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:36.432369" elapsed="0.005489"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.432076" elapsed="0.005814"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.438059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.437914" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.432057" elapsed="0.006077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.439021" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:36.438274" elapsed="0.000776"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.439100" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.428512" elapsed="0.010710"/>
</kw>
<msg time="2026-04-25T23:57:36.439276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.415807" elapsed="0.023515"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.451748" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.464168" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.476532" 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-04-25T23:57:36.476782" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.476956" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.477356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.477200" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.477163" elapsed="0.000388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.477717" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.477885" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.478047" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:36.477135" elapsed="0.000965"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.477033" elapsed="0.001093"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.478267" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.478342" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:36.478461" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:57:36.411374" elapsed="0.067114"/>
</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-04-25T23:57:36.503223" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.502853" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.503955" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.503751" elapsed="0.000267">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.504110" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.503409" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.504685" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/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-04-25T23:57:36.504292" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.505005" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.505132" level="INFO">${template} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="https://example.com/ns/example-action"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.504871" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.505569" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="https://example.com/ns/example-action"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.505322" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:57:36.506015" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.505696" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.506535" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.506242" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.506098" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.505676" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.507209" level="INFO">${final_text} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="https://example.com/ns/example-action"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&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-04-25T23:57:36.506779" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.507286" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.502231" elapsed="0.005178"/>
</kw>
<msg time="2026-04-25T23:57:36.507463" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.489599" elapsed="0.017909"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.521540" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.534113" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.546583" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.546789" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.546965" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.547332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.547188" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.547174" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.547550" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.547733" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.547901" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:36.547146" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.547042" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.548124" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.548232" elapsed="0.000017"/>
</return>
<msg time="2026-04-25T23:57:36.548353" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="https://example.com/ns/example-action"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&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-04-25T23:57:36.488728" elapsed="0.059654"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.549682" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.549419" elapsed="0.000328">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.549840" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.549056" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.550180" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.549936" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.550735" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.550424" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.550261" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.549917" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.553151" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.550970" elapsed="0.002208"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:36.553230" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:57:36.553397" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:36.548729" elapsed="0.004693"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.554952" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.554704" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.555403" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="https://example.com/ns/example-action"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.555150" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.555862" 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-04-25T23:57:36.555598" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.556289" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.556052" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.557139" 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-04-25T23:57:36.556946" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:36.557498" 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-04-25T23:57:36.557325" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.557683" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.558276" 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-04-25T23:57:36.558032" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:36.558361" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.558514" 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-04-25T23:57:36.556527" elapsed="0.002011"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:36.563513" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.560877" elapsed="0.004328">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.558608" elapsed="0.006697">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.565492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.565340" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.558590" elapsed="0.006993">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.565965" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.566101" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.566064" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.566047" 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-04-25T23:57:36.566305" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.566372" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.553761" elapsed="0.012713">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.566556" 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-04-25T23:57:36.400215" elapsed="0.166435">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:36.566956" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.566780" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.566763" elapsed="0.000282"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.567077" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}dataorigaction</arg>
<arg>${mapping}</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-04-25T23:57:36.395751" elapsed="0.171420">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.334564" elapsed="0.232751">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t7" name="Invoke_Yang1.1_Action_Via_Json_Post" line="80">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:36.570671" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:36.570398" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.571910" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.571802" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.571783" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.577074" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.576968" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.576950" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.578142" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.577763" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.578622" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:36.578328" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:36.578719" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.578875" 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-04-25T23:57:36.577369" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.584409" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.584302" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.584283" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.585726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.585576" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.585558" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.586290" level="INFO">${karaf_connection_index} = 100</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.585933" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.586737" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.586470" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.587572" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.587306" elapsed="0.001231">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.588730" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:36.588776" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.586922" elapsed="0.001877"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.589638" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.589364" elapsed="0.001351">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.590892" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:36.590937" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.588962" elapsed="0.001998"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.591863" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.591249" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.591034" elapsed="0.000999">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.591016" elapsed="0.001197">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.592376" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.592648" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.592504" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.592485" elapsed="0.000277"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.592796" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.595787" elapsed="0.000155"/>
</kw>
<msg time="2026-04-25T23:57:36.596014" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.595126" 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-04-25T23:57:36.597124" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.598088" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.593641" elapsed="0.004562"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.593052" elapsed="0.005263"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.585277" elapsed="0.013122">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</status>
</kw>
<msg time="2026-04-25T23:57:36.598501" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.598544" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Action_Via_Json_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.584620" elapsed="0.013948"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.598767" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.598644" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.598625" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.599613" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.599508" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.599487" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.599965" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.600066" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.599844" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.600493" level="INFO">{1: 100}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.600240" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.601149" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.600899" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.601739" elapsed="0.000318"/>
</kw>
<msg time="2026-04-25T23:57:36.602156" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:36.602202" level="INFO">${old_connection_index} = 100</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.601365" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.603034" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.605160" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.604744" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.603429" elapsed="0.002365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.607281" elapsed="0.000355"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.606035" elapsed="0.001679"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:36.602517" elapsed="0.005300"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.602301" elapsed="0.005599"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.602283" elapsed="0.005646"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.608971" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.608456" elapsed="0.000542"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:36.609047" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.609203" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.608132" elapsed="0.001117"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.609404" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.610112" level="INFO">index=101
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.610000" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.610380" elapsed="0.002554"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.613370" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:36.614337" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.613097" elapsed="0.001626">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.624927" elapsed="0.000328"/>
</kw>
<msg time="2026-04-25T23:57:36.625312" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.623542" elapsed="0.001858"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.625748" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.626008" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.615503" elapsed="0.010647"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.614996" elapsed="0.011203"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.599215" elapsed="0.027066">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.626613" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.626702" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.583965" elapsed="0.042843">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:36.626912" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.626955" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.579263" elapsed="0.047715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.627304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.627053" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.627035" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:36.579123" elapsed="0.048281"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:36.578952" elapsed="0.048482"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:36.576594" elapsed="0.050893"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:36.571498" elapsed="0.056043"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.571081" elapsed="0.056504"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:36.568237" elapsed="0.059452"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.628282" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:57:36.627857" elapsed="0.000452"/>
</kw>
<kw name="Post_As_Json_Rfc8040_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.674007" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.673608" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.674753" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.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-04-25T23:57:36.674529" elapsed="0.000287">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.674913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.674198" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.675480" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.675098" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.675820" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.675953" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/example-action:interfaces/interface=eth1/reset
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.675684" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.676381" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/example-action:interfaces/interface=eth1/reset
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.676131" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.677399" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.677129" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.677880" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.677601" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.678552" 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-04-25T23:57:36.678256" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.679327" 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-04-25T23:57:36.679090" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.679403" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.679554" 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-04-25T23:57:36.678776" 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-04-25T23:57:36.679750" elapsed="0.000226"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:36.678123" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.680552" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:36.680258" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.681330" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.681086" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.681406" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.681556" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:36.680774" 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-04-25T23:57:36.681783" elapsed="0.000223"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:36.680128" elapsed="0.001918"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.677954" elapsed="0.004127"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.682123" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:36.682278" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:36.676809" elapsed="0.005494"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.676502" elapsed="0.005833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.682506" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.682359" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.676477" elapsed="0.006104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.683296" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:36.682736" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.683373" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.672969" elapsed="0.010526"/>
</kw>
<msg time="2026-04-25T23:57:36.683550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.660125" elapsed="0.023472"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.696535" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.709104" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.721496" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.721702" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.721877" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.722237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.722095" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.722080" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.722452" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.722615" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.722832" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:36.722052" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.721952" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.723057" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.723132" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:36.723251" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:57:36.655872" elapsed="0.067405"/>
</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-04-25T23:57:36.748101" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/post_data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.747722" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.748835" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.titanium/post_data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.748616" elapsed="0.000281">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction.titanium/post_data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.748991" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.748288" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.749567" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/post_data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.749185" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.749904" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/post_data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/post_data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.750032" level="INFO">${template} = {
   "example-action:input":{
      "delay":600
   }
}

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.749769" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.750451" level="INFO">{
   "example-action:input":{
      "delay":600
   }
}

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.750212" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:57:36.750863" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.750560" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.751378" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.751087" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.750945" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.750542" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.752048" level="INFO">${final_text} = {
   "example-action:input":{
      "delay":600
   }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:36.751603" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.752124" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.747102" elapsed="0.005145"/>
</kw>
<msg time="2026-04-25T23:57:36.752299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.734324" elapsed="0.018055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.764971" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.777344" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.789941" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.790135" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.790307" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.790676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.790522" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.790508" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.790893" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.791058" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.791221" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:36.790480" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.790380" 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-04-25T23:57:36.791439" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.791513" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:36.791624" level="INFO">${data} = {
   "example-action:input":{
      "delay":600
   }
}</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-04-25T23:57:36.733466" elapsed="0.058183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.792945" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.792666" elapsed="0.000343">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/dataorigaction/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.793101" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.792316" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.793505" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.793254" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.794067" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.793768" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.793589" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.793234" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.796482" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.794302" elapsed="0.002207"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:36.796561" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:36.796743" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/dataorigaction/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:36.791994" elapsed="0.004775"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.798299" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.798053" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.798855" level="INFO">{
   "example-action:input":{
      "delay":600
   }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.798495" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.799295" level="INFO">{'Content-Type': 'application/yang-data+json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.799051" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.799746" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.799486" elapsed="0.000303"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.800573" level="INFO">${accumulator} = {'Content-Type': 'application/yang-data+json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:57:36.800384" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:36.800937" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:57:36.800765" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.801109" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.801730" level="INFO">{'Content-Type': 'application/yang-data+json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.801470" elapsed="0.000303"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:36.801815" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.801970" level="INFO">${headers} = {'Content-Type': 'application/yang-data+json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:57:36.799985" elapsed="0.002010"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:36.806933" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.804337" elapsed="0.004227">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.802066" elapsed="0.006582">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.808854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.808703" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.802048" elapsed="0.006895">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.809335" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.809508" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.809468" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.809450" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.809729" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.809796" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.797098" elapsed="0.012802">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.809982" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_RFC8040_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.644769" elapsed="0.165306">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.810360" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.810188" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.810171" elapsed="0.000277"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.810480" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}dataorigaction</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.
RFC8040 defines RESTCONF protocol, for configuring data defined in YANG version 1
or YANG version 1.1, using the datastore concepts defined in NETCONF.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.640406" elapsed="0.170167">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.567650" elapsed="0.243082">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/example-action:interfaces/interface=eth1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t8" name="Invoke_Yang1.1_Augmentation_Via_Xml_Post" line="87">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:36.814047" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:36.813787" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.815285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.815176" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.815157" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.820417" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.820311" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.820293" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.821493" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.821092" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.821987" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:36.821692" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:36.822091" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.822248" 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-04-25T23:57:36.820721" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.827718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.827595" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.827577" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.828991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.828884" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.828866" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.829565" level="INFO">${karaf_connection_index} = 101</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.829212" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.830011" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.829764" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.830862" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.830581" elapsed="0.001139">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.831897" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:36.831942" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.830192" elapsed="0.001773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.832798" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.832511" elapsed="0.001324">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:36.834010" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:36.834055" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.832127" elapsed="0.001952"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.835124" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.834366" elapsed="0.000839">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:36.834153" elapsed="0.001145">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:36.834134" elapsed="0.001198">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.835493" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.835732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.835578" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.835561" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.835862" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.838919" elapsed="0.000162"/>
</kw>
<msg time="2026-04-25T23:57:36.839152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.838260" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.840174" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.841125" 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-04-25T23:57:36.836758" elapsed="0.004482"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.836115" elapsed="0.005238"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.828560" elapsed="0.012909">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</status>
</kw>
<msg time="2026-04-25T23:57:36.841574" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.841618" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Xml_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.827931" elapsed="0.013712"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.841910" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.841801" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.841782" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.842773" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:36.842667" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.842636" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.843106" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.843209" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:36.842987" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.843644" level="INFO">{1: 101}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.843384" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.844102" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.843858" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.844669" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:57:36.845092" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:36.845162" level="INFO">${old_connection_index} = 101</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.844301" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.846066" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.848169" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.847750" elapsed="0.000980">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.846468" elapsed="0.002338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.850451" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.849037" elapsed="0.001851"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:36.845484" elapsed="0.005506"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.845264" elapsed="0.005777"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.845244" elapsed="0.005822"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:36.851999" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.851580" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:36.852073" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.852222" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.851262" elapsed="0.000984"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.852398" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.853271" level="INFO">index=102
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:36.852990" elapsed="0.000409"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.853588" elapsed="0.002252"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:36.856256" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:36.857112" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.856000" elapsed="0.001484">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:36.867789" elapsed="0.000317"/>
</kw>
<msg time="2026-04-25T23:57:36.868163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.866474" elapsed="0.001777"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.868574" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.868847" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:36.858391" elapsed="0.010597"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:36.857888" elapsed="0.011148"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.842361" elapsed="0.026767">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.869455" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.869528" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.827259" elapsed="0.042370">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:36.869959" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:36.870002" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.822636" elapsed="0.047389"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.870347" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.870102" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.870084" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:36.822497" elapsed="0.047948"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:36.822325" elapsed="0.048152"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:36.819950" elapsed="0.050580"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:36.814892" elapsed="0.055693"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:36.814457" elapsed="0.056172"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:36.811618" elapsed="0.059079"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.871281" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:57:36.870861" elapsed="0.000447"/>
</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-04-25T23:57:36.906927" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.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-04-25T23:57:36.906533" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.907693" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.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-04-25T23:57:36.907437" elapsed="0.000320">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.907893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.907113" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.908460" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:36.908078" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.908799" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.908943" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/main:cont/augment-main-a:cont1/reset
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.908646" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.909386" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/main:cont/augment-main-a:cont1/reset
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.909141" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.910376" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.910120" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.910851" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.910574" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.911516" 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-04-25T23:57:36.911224" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.912292" 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-04-25T23:57:36.912049" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.912368" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:36.912517" 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-04-25T23:57:36.911737" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.912709" elapsed="0.000223"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:36.911095" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.913517" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:36.913223" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:36.914338" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.914103" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:36.914413" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:36.914562" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:36.913739" elapsed="0.000846"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:36.914750" elapsed="0.000224"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:36.913095" elapsed="0.001918"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.910925" elapsed="0.004123"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:36.915093" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:36.915246" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:36.909804" elapsed="0.005466"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.909496" elapsed="0.005806"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.915470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.915326" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.909477" elapsed="0.006067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.916249" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:36.915695" elapsed="0.000581"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.916323" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.905920" elapsed="0.010560"/>
</kw>
<msg time="2026-04-25T23:57:36.916534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.893046" elapsed="0.023534"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.929167" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.941524" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.953917" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.954105" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.954276" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.954631" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.954491" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:36.954477" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.954861" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.955023" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.955184" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:36.954450" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.954350" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.955400" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:36.955474" elapsed="0.000014"/>
</return>
<msg time="2026-04-25T23:57:36.955590" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:57:36.887259" elapsed="0.068357"/>
</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-04-25T23:57:36.980451" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.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-04-25T23:57:36.980078" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.981190" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.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-04-25T23:57:36.980979" elapsed="0.000273">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:36.981343" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:36.980636" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.981924" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/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-04-25T23:57:36.981526" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:36.982239" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:36.982365" level="INFO">${template} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="ns:augment:main:a"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;

</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:36.982108" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.982808" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="ns:augment:main:a"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;

</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:36.982547" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:57:36.983203" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:36.982921" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.983733" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:36.983426" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:36.983284" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:36.982902" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:36.984384" level="INFO">${final_text} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="ns:augment:main:a"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&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-04-25T23:57:36.983957" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:36.984460" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:36.979459" elapsed="0.005126"/>
</kw>
<msg time="2026-04-25T23:57:36.984638" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:36.966844" elapsed="0.017856"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:36.997250" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.009871" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.022418" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.022614" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.022802" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.023159" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.023018" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.023003" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.023373" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.023537" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.023715" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.022976" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.022876" 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-04-25T23:57:37.023935" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.024009" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:37.024126" level="INFO">${data} = &lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="ns:augment:main:a"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&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-04-25T23:57:36.965949" elapsed="0.058204"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.025400" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.025163" elapsed="0.000299">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.025559" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.024818" 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-04-25T23:57:37.025912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.025669" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.026441" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.026151" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.025991" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.025635" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.028854" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.026685" elapsed="0.002195"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:37.028931" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:37.029104" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:37.024476" elapsed="0.004654"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.030677" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.030418" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.031148" level="INFO">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;input xmlns="ns:augment:main:a"&gt;
  &lt;delay&gt;600&lt;/delay&gt;
&lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.030910" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.031588" 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-04-25T23:57:37.031342" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.032033" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.031795" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.032869" 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-04-25T23:57:37.032679" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:37.033240" 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-04-25T23:57:37.033068" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.033413" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.034021" 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-04-25T23:57:37.033776" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:37.034106" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:37.034259" 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-04-25T23:57:37.032270" elapsed="0.002013"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:37.039063" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.036601" elapsed="0.004083">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.034352" elapsed="0.006417">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.040952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.040803" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.034335" elapsed="0.006733">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.041432" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.041564" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.041527" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.041511" elapsed="0.000114"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.041780" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.041846" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.029448" elapsed="0.012500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.042059" 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-04-25T23:57:36.876092" elapsed="0.166064">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:37.042439" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.042267" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.042251" elapsed="0.000277"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.042560" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}augment</arg>
<arg>${mapping}</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-04-25T23:57:36.871568" elapsed="0.171098">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:57:36.811034" elapsed="0.231775">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t9" name="Invoke_Yang1.1_Augmentation_Via_Json_Post" line="92">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:37.046126" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:37.045871" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.047366" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.047257" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.047238" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.052513" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.052407" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.052389" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.053600" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.053217" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.054099" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:37.053802" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:37.054169" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:37.054322" 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-04-25T23:57:37.052818" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.059767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.059645" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.059627" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.061086" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.060968" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.060951" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.061645" level="INFO">${karaf_connection_index} = 102</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.061293" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.062103" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.061845" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.062998" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.062733" elapsed="0.001171">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.064083" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:37.064128" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.062328" elapsed="0.001823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.064995" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.064720" elapsed="0.001348">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.066243" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:37.066288" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.064313" elapsed="0.001998"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.067225" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.066607" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.066386" elapsed="0.001012">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.066367" elapsed="0.001212">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.067763" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.067993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.067852" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.067835" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.068123" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.071187" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:57:37.071410" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.070453" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.072423" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.073481" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.068985" elapsed="0.004610"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.068380" elapsed="0.005346"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.060606" elapsed="0.013205">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</status>
</kw>
<msg time="2026-04-25T23:57:37.073913" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.073957" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Invoke_Yang1.1_Augmentation_Via_Json_Post"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.059984" elapsed="0.013996"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.074163" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.074056" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.074038" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.075017" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.074913" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.074895" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.075345" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.075446" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.075229" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.075935" level="INFO">{1: 102}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.075677" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.076372" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.076130" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.076988" elapsed="0.000327"/>
</kw>
<msg time="2026-04-25T23:57:37.077415" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:37.077461" level="INFO">${old_connection_index} = 102</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.076571" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.078300" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.080382" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.079967" elapsed="0.001098">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.078714" elapsed="0.002427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.082594" elapsed="0.000365"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.081372" elapsed="0.001649"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:37.077794" elapsed="0.005328"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.077560" elapsed="0.005613"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.077541" elapsed="0.005658"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.084143" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.083741" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:37.084218" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:37.084370" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.083399" 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-04-25T23:57:37.084550" elapsed="0.000504"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.085333" level="INFO">index=103
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.085221" 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-04-25T23:57:37.085607" elapsed="0.002423"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.088447" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:37.089351" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.088191" elapsed="0.001541">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.099867" elapsed="0.000321"/>
</kw>
<msg time="2026-04-25T23:57:37.100246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.098557" elapsed="0.001779"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.100815" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.101089" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.090504" elapsed="0.010751"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.089997" elapsed="0.011307"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.074607" elapsed="0.026814">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.102038" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.102112" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.059311" elapsed="0.042906">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:37.102322" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.102366" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.054727" elapsed="0.047663"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.102734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.102467" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.102449" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:37.054566" elapsed="0.048270"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:37.054398" elapsed="0.048467"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:37.052044" elapsed="0.050876"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:37.046973" elapsed="0.056003"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.046537" elapsed="0.056484"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:37.043699" elapsed="0.059374"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.103702" level="INFO">${mapping} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</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-04-25T23:57:37.103236" elapsed="0.000493"/>
</kw>
<kw name="Post_As_Json_Rfc8040_Templated" owner="TemplatedRequests">
<kw name="Post_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.149298" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.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-04-25T23:57:37.148887" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.150037" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.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-04-25T23:57:37.149829" elapsed="0.000271">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.150191" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.149482" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.150776" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.150375" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.151093" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:37.151221" level="INFO">${template} = $RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/main:cont/augment-main-a:cont1/reset
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:37.150960" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.151644" level="INFO">$RESTCONF_ROOT/data/network-topology:network-topology/topology=topology-netconf/node=$DEVICE_NAME/yang-ext:mount/main:cont/augment-main-a:cont1/reset
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.151399" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.152627" level="INFO">mapping: {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.152376" elapsed="0.000362"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.153171" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.152895" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.153860" 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-04-25T23:57:37.153544" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.154618" 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-04-25T23:57:37.154380" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.154719" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.154873" 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-04-25T23:57:37.154069" 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-04-25T23:57:37.155044" elapsed="0.000224"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:37.153413" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.155865" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:37.155550" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.156614" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.156381" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.156706" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.156856" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:37.156071" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.157039" elapsed="0.000221"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:37.155421" elapsed="0.001878"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:37.153245" elapsed="0.004089"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:37.157375" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:37.157528" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:37.152060" elapsed="0.005494"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.151775" elapsed="0.005811"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.157774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.157611" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.151756" elapsed="0.006094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.158546" level="INFO">${final_text} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:37.157990" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:37.158622" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:37.148262" elapsed="0.010501"/>
</kw>
<msg time="2026-04-25T23:57:37.158818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.135391" elapsed="0.023474"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.171531" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.184090" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.196550" 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-04-25T23:57:37.196751" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.196924" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.197302" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.197162" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.197147" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.197518" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.197698" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.197864" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.197120" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.197018" 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-04-25T23:57:37.198083" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.198157" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:37.198274" level="INFO">${uri} = /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:57:37.131128" elapsed="0.067172"/>
</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-04-25T23:57:37.223169" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/post_data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.222793" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.223907" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.titanium/post_data.json' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.223699" elapsed="0.000271">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment.titanium/post_data.json' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.224062" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.223355" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.224629" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/post_data.json</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.224247" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.225689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/post_data.json"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/post_data.json&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:37.225862" level="INFO">${template} = {
   "ns:augment:main:a:input":{
      "delay":600
   }
}
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:37.224827" elapsed="0.001061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.226287" level="INFO">{
   "ns:augment:main:a:input":{
      "delay":600
   }
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.226042" 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-04-25T23:57:37.226700" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.226398" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.227218" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'netconf-test-device', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.226926" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.226783" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.226379" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.227891" level="INFO">${final_text} = {
   "ns:augment:main:a:input":{
      "delay":600
   }
}</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:57:37.227443" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:37.227967" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:37.222169" elapsed="0.005924"/>
</kw>
<msg time="2026-04-25T23:57:37.228145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.209358" elapsed="0.018834"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.240866" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.253212" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.265550" 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-04-25T23:57:37.265752" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.265925" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.266282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.266142" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.266128" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.266495" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.266673" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.266837" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.266100" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.265998" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.267096" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.267171" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:57:37.267285" level="INFO">${data} = {
   "ns:augment:main:a:input":{
      "delay":600
   }
}</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-04-25T23:57:37.208451" elapsed="0.058860"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.268548" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.268312" elapsed="0.000298">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/CRUD/augment/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.268717" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.267978" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.269077" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.268812" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.269608" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.269317" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.269157" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.268794" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.272041" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.269855" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:37.272119" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.272273" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/CRUD-ACTION/../../../variables/netconf/CRUD/augment/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:37.267639" elapsed="0.004659"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.273831" level="INFO">/restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.273568" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.274263" level="INFO">{
   "ns:augment:main:a:input":{
      "delay":600
   }
}</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.274028" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.274712" level="INFO">{'Content-Type': 'application/yang-data+json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.274453" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.275138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.274903" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.275979" level="INFO">${accumulator} = {'Content-Type': 'application/yang-data+json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-25T23:57:37.275789" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:37.276320" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-25T23:57:37.276152" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.276489" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.277095" level="INFO">{'Content-Type': 'application/yang-data+json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.276840" elapsed="0.000298"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:37.277179" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.277331" level="INFO">${headers} = {'Content-Type': 'application/yang-data+json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-25T23:57:37.275376" elapsed="0.001979"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:37.282209" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.279744" elapsed="0.004114">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.277424" elapsed="0.006517">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.284121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.283974" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.277407" elapsed="0.006803">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.284571" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.284783" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.284745" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.284725" 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-04-25T23:57:37.284997" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.285064" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.272620" elapsed="0.012546">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.285245" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=json</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_RFC8040_JSON}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Post_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.119855" elapsed="0.165482">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.285619" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.285449" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.285432" elapsed="0.000293"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.285758" elapsed="0.000014"/>
</return>
<arg>${DIRECTORY_WITH_TEMPLATE_FOLDERS}${/}augment</arg>
<arg>${mapping}</arg>
<doc>Add arguments sensible for JSON data, return Post_Templated response text.
Optionally, verification against response.json (no iteration) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.
RFC8040 defines RESTCONF protocol, for configuring data defined in YANG version 1
or YANG version 1.1, using the datastore concepts defined in NETCONF.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.115493" elapsed="0.170359">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.043106" elapsed="0.242922">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology/topology=topology-netconf/node=netconf-test-device/yang-ext:mount/main:cont/augment-main-a:cont1/reset (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t10" name="Deconfigure_Device_From_Netconf" line="99">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:37.289295" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:37.289037" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.290552" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.290437" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.290419" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.295748" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.295625" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.295607" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.296811" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.296413" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.297305" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:37.297007" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:37.297376" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:37.297532" 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-04-25T23:57:37.296038" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.302995" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.302888" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.302869" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.304262" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.304157" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.304139" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.304841" level="INFO">${karaf_connection_index} = 103</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.304470" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.305298" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.305047" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.306145" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.305880" elapsed="0.001132">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.307187" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:37.307233" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.305480" elapsed="0.001777"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.308098" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.307825" elapsed="0.001292">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.309292" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:37.309338" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.307420" elapsed="0.001941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.311650" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.309651" elapsed="0.002096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.309436" elapsed="0.002405">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.309417" elapsed="0.002489">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.312069" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.312294" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.312156" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.312139" elapsed="0.000251"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.312422" 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-04-25T23:57:37.315531" elapsed="0.000170"/>
</kw>
<msg time="2026-04-25T23:57:37.315773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.314856" elapsed="0.001013"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.316782" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.317739" elapsed="0.000035"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.313283" elapsed="0.004570"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.312694" elapsed="0.005275"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.303854" elapsed="0.014198">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</status>
</kw>
<msg time="2026-04-25T23:57:37.318155" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.318198" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Deconfigure_Device_From_Netconf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.303210" elapsed="0.015012"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.318405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.318298" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.318280" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.319290" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.319187" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.319169" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.319623" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.319742" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.319503" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.320177" level="INFO">{1: 103}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.319918" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.320612" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.320368" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.321201" elapsed="0.000326"/>
</kw>
<msg time="2026-04-25T23:57:37.321626" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:37.321688" level="INFO">${old_connection_index} = 103</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.320828" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.322510" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.324742" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.324294" elapsed="0.001014">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.323015" elapsed="0.002371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.327042" elapsed="0.000360"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.325625" elapsed="0.001840"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:37.322007" elapsed="0.005602"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.321790" elapsed="0.005887"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.321772" elapsed="0.005932"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.328639" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.328230" elapsed="0.000461"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:37.328741" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:37.328923" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.327906" elapsed="0.001044"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.329105" elapsed="0.000406"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.329811" level="INFO">index=104
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.329697" elapsed="0.000416"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.330263" elapsed="0.002227"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.333214" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:37.334196" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.332941" elapsed="0.001633">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.344882" elapsed="0.000323"/>
</kw>
<msg time="2026-04-25T23:57:37.345262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.343570" elapsed="0.001781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.345759" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.346022" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.335362" elapsed="0.010800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.334858" elapsed="0.011353"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.318896" elapsed="0.027396">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.346622" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.346712" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.302536" elapsed="0.044281">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:37.346920" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.346963" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.297936" elapsed="0.049049"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.347309" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.347061" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.347044" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:37.297796" elapsed="0.049611"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:37.297609" elapsed="0.049826"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:37.295259" elapsed="0.052229"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:37.290149" elapsed="0.057430"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.289727" elapsed="0.057897"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:37.286900" elapsed="0.060792"/>
</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-04-25T23:57:37.367246" elapsed="0.000435"/>
</kw>
<msg time="2026-04-25T23:57:37.367733" 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-04-25T23:57:37.366889" 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-04-25T23:57:37.366487" elapsed="0.001370"/>
</kw>
<msg time="2026-04-25T23:57:37.367899" 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-04-25T23:57:37.357842" elapsed="0.010099"/>
</kw>
<msg time="2026-04-25T23:57:37.368042" 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-04-25T23:57:37.357493" elapsed="0.010573"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.368963" level="INFO">${mapping} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</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-04-25T23:57:37.368226" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="'${http_method}'=='post'">
<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-04-25T23:57:37.401494" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:57:37.401119" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.402237" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:57:37.402027" elapsed="0.000272">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.402391" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.401695" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.402975" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.402576" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.403295" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:37.403450" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:37.403160" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.403896" level="INFO">$RESTCONF_ROOT/operations/netconf-node-topology:delete-device
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.403634" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.404890" level="INFO">mapping: {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tmp/schema', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.404607" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.405348" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.405089" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.406284" level="INFO">${value} = 10.30.171.48</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:37.405786" elapsed="0.000524"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.407427" level="INFO">${encoded} = 10.30.171.48</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.406953" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.407580" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:37.407824" level="INFO">${encoded_value} = 10.30.171.48</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:37.406495" elapsed="0.001355"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.408001" elapsed="0.000469"/>
</kw>
<var name="${key}">DEVICE_IP</var>
<var name="${value}">10.30.171.48</var>
<status status="PASS" start="2026-04-25T23:57:37.405637" elapsed="0.002875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.409289" 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-04-25T23:57:37.408771" elapsed="0.000545"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.410567" 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-04-25T23:57:37.410092" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.410736" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:37.410962" 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-04-25T23:57:37.409498" elapsed="0.001490"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.411138" elapsed="0.000465"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">netconf-test-device</var>
<status status="PASS" start="2026-04-25T23:57:37.408625" elapsed="0.003020"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.412418" 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-04-25T23:57:37.411927" elapsed="0.000517"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.413569" 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-04-25T23:57:37.413091" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.413737" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.413962" 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-04-25T23:57:37.412628" elapsed="0.001359"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.414137" elapsed="0.000465"/>
</kw>
<var name="${key}">DEVICE_PORT</var>
<var name="${value}">17830</var>
<status status="PASS" start="2026-04-25T23:57:37.411796" elapsed="0.002847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.415397" 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-04-25T23:57:37.414903" elapsed="0.000552"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.416614" 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-04-25T23:57:37.416143" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.416783" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.417019" 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-04-25T23:57:37.415642" elapsed="0.001402"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.417193" elapsed="0.000481"/>
</kw>
<var name="${key}">DEVICE_USER</var>
<var name="${value}">admin</var>
<status status="PASS" start="2026-04-25T23:57:37.414772" elapsed="0.002945"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.418455" 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-04-25T23:57:37.417959" elapsed="0.000522"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.419590" 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-04-25T23:57:37.419113" elapsed="0.000517"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.419839" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.420062" 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-04-25T23:57:37.418677" elapsed="0.001411"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.420238" elapsed="0.000549"/>
</kw>
<var name="${key}">DEVICE_PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-25T23:57:37.417830" elapsed="0.003022"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.421640" 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-04-25T23:57:37.421139" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.422794" 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-04-25T23:57:37.422304" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.422946" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.423169" 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-04-25T23:57:37.421868" 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-04-25T23:57:37.423347" elapsed="0.000560"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:57:37.421005" elapsed="0.002944"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.424704" 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-04-25T23:57:37.424195" elapsed="0.000536"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.425848" 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-04-25T23:57:37.425362" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.426000" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:37.426223" 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-04-25T23:57:37.424926" elapsed="0.001322"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.426399" elapsed="0.000486"/>
</kw>
<var name="${key}">SCHEMA_DIRECTORY</var>
<var name="${value}">/tmp/schema</var>
<status status="PASS" start="2026-04-25T23:57:37.424063" elapsed="0.002864"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.427970" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:57:37.427171" elapsed="0.000825"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:57:37.429114" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.428614" elapsed="0.000540"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:57:37.429265" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:37.429489" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:57:37.428181" elapsed="0.001334"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.429684" elapsed="0.000468"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:57:37.427040" elapsed="0.003154"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:57:37.405457" elapsed="0.024771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:57:37.430271" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:37.430432" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:57:37.404291" elapsed="0.026167"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.404007" elapsed="0.026483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.430677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.430514" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.403988" elapsed="0.026765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.431565" level="INFO">${final_text} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:57:37.430893" elapsed="0.000699"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:37.431641" elapsed="0.000132"/>
</return>
<arg>folder=${folder}</arg>
<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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:37.400481" elapsed="0.031392"/>
</kw>
<msg time="2026-04-25T23:57:37.431926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.387873" elapsed="0.044100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.444999" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.457388" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.469793" 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-04-25T23:57:37.469984" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.470156" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.470516" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.470375" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.470360" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.470746" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.470913" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.471077" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.470333" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.470231" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.471296" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.471370" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:37.471479" level="INFO">${uri} = /restconf/operations/netconf-node-topology:delete-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-04-25T23:57:37.383448" elapsed="0.088057"/>
</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-04-25T23:57:37.496271" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:57:37.495896" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.497026" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.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-04-25T23:57:37.496812" elapsed="0.000286">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.497195" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.496456" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.497820" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/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-04-25T23:57:37.497416" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.498144" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:57:37.498273" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:57:37.498008" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.498712" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;$DEVICE_NAME&lt;/node-id&gt;
 &lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.498454" 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-04-25T23:57:37.499114" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.498827" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.499637" level="INFO">${mapping_to_use} = {'DEVICE_IP': '10.30.171.48', 'DEVICE_NAME': 'netconf-test-device', 'DEVICE_PORT': '17830', 'DEVICE_USER': 'admin', 'DEVICE_PASSWORD': 'topsecret', 'DEVICE_KEY': 'device-key', 'SCHEMA_DIRECTORY': '/tm...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.499340" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.499196" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.498808" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.500743" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:57:37.499882" elapsed="0.000892"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:57:37.500847" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:57:37.495269" elapsed="0.005708"/>
</kw>
<msg time="2026-04-25T23:57:37.501030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.482525" elapsed="0.018553"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.513551" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.526106" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.538557" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.538780" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.538997" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.539362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.539219" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.539204" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.539585" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.539767" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.539933" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.539176" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.539074" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.540153" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.540227" elapsed="0.000015"/>
</return>
<msg time="2026-04-25T23:57:37.540343" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&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-04-25T23:57:37.481679" elapsed="0.058691"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:57:37.541723" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.541382" elapsed="0.000407">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/device/scandium/rpc-delete-device/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:57:37.541881" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:57:37.541046" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.542220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.541976" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.542801" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:37.542462" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.542301" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.541957" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.545247" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.543031" elapsed="0.002244"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:57:37.545325" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.545479" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../variables/netconf/device/scandium/rpc-delete-device/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:57:37.540711" elapsed="0.004793"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.547130" level="INFO">/restconf/operations/netconf-node-topology:delete-device</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.546785" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.547564" level="INFO">&lt;input xmlns="urn:opendaylight:netconf-node-topology"&gt;
   &lt;node-id&gt;netconf-test-device&lt;/node-id&gt;
 &lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.547327" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.548023" 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-04-25T23:57:37.547781" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.548450" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.548214" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.549304" 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-04-25T23:57:37.549117" elapsed="0.000255"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:57:37.549724" 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-04-25T23:57:37.549529" elapsed="0.000221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.549900" elapsed="0.000199"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.550501" 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-04-25T23:57:37.550254" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:57:37.550587" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.550758" 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-04-25T23:57:37.548709" elapsed="0.002074"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<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="NOT RUN" start="2026-04-25T23:57:37.553145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.550854" elapsed="0.002358"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:37.555947" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:57:37.553379" elapsed="0.004192">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.553236" elapsed="0.004443">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.550836" elapsed="0.006878">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.558082" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.558217" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.558179" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.558163" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.558419" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.558484" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.545842" elapsed="0.012745">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.558683" 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-04-25T23:57:37.372300" elapsed="0.186481">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:57:37.559067" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.558895" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.558878" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.559227" elapsed="0.000015"/>
</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 Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.369390" elapsed="0.189934">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.369079" elapsed="0.190312">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="Put_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 Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.559672" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.559422" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.369060" elapsed="0.190703">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="NOT RUN" start="2026-04-25T23:57:37.559913" elapsed="0.000021"/>
</kw>
<arg>${DEVICE_NAME}</arg>
<arg>device_type=${DEVICE_TYPE_RPC_DELETE}</arg>
<arg>http_timeout=2</arg>
<arg>http_method=post</arg>
<doc>Tell Netconf about the specified device so it can add it into its configuration.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.347962" elapsed="0.212064">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:37.286327" elapsed="0.273847">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-node-topology:delete-device (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s5-s1-t11" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="109">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-25T23:57:37.564172" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-25T23:57:37.563915" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.565444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.565337" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.565318" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.570609" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.570496" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.570478" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.571690" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:37.571294" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.572175" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:37.571879" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:37.572246" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:37.572403" 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-04-25T23:57:37.570916" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.577883" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.577775" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.577756" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.579146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.579040" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.579022" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.579727" level="INFO">${karaf_connection_index} = 104</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.579354" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.580196" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.579945" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.581058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.580792" elapsed="0.001133">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.582103" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:37.582149" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.580381" elapsed="0.001791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.583016" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.582742" elapsed="0.001297">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:37.584215" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:37.584261" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.582338" elapsed="0.001946"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.585348" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.584576" elapsed="0.000852">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.584360" elapsed="0.001161">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.584340" elapsed="0.001215">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.585732" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.585962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.585820" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.585802" elapsed="0.000256"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.586091" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.589073" elapsed="0.000152"/>
</kw>
<msg time="2026-04-25T23:57:37.589295" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.588393" elapsed="0.000996"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.590308" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.591252" elapsed="0.000036"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.586944" elapsed="0.004420"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.586346" elapsed="0.005132"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.578738" elapsed="0.012825">Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</status>
</kw>
<msg time="2026-04-25T23:57:37.591766" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.591814" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION.Check_Device_Going_To_Be_Gone_After_Deconfiguring"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.578099" elapsed="0.013740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.592023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.591916" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.591897" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.592900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.592795" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.592777" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.593279" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.593383" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:37.593157" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.593838" level="INFO">{1: 104}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.593562" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.594276" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.594034" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.594846" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:57:37.595264" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:37.595312" level="INFO">${old_connection_index} = 104</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.594475" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.596258" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.598469" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.597968" elapsed="0.001055">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.596678" elapsed="0.002423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.600727" elapsed="0.000374"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.599334" elapsed="0.001830"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:37.595630" elapsed="0.005638"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.595412" elapsed="0.005907"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.595393" elapsed="0.005951"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:37.602289" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.601883" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:37.602364" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:37.602514" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.601544" elapsed="0.000999"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.602708" elapsed="0.000564"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.603553" level="INFO">index=105
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:37.603440" elapsed="0.000268"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:37.603854" elapsed="0.002209"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:37.606479" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:37.607494" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.606222" elapsed="0.001682">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:37.618100" elapsed="0.000319"/>
</kw>
<msg time="2026-04-25T23:57:37.618476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:37.616811" elapsed="0.001764"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.618920" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.619177" elapsed="0.000053"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:37.608728" elapsed="0.010627"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:37.608174" elapsed="0.011228"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.592473" elapsed="0.027010">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.620010" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.620085" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.577421" elapsed="0.042767">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:37.620291" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:37.620334" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.572815" elapsed="0.047542"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.620696" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.620432" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.620414" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:37.572665" elapsed="0.048142"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:37.572480" elapsed="0.048356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:37.570132" elapsed="0.050757"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-25T23:57:37.565054" elapsed="0.055889"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:37.564587" elapsed="0.056399"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-25T23:57:37.561776" elapsed="0.059262"/>
</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-04-25T23:57:37.634145" 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-04-25T23:57:37.632049" elapsed="0.002123"/>
</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-04-25T23:57:37.634492" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:37.634342" elapsed="0.000206"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.634225" 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-04-25T23:57:37.634885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.634635" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.635680" level="INFO">${uri} = /restconf/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-04-25T23:57:37.635192" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:37.634966" 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-04-25T23:57:37.635932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.635769" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:37.634618" elapsed="0.001388"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:37.636038" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:37.636186" level="INFO">${uri} = /restconf/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-04-25T23:57:37.631583" elapsed="0.004627"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:37.636256" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:37.636397" level="INFO">${uri} = /restconf/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-04-25T23:57:37.631109" elapsed="0.005312"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.643763" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.643493" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:37.644204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:37.643961" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:37.648785" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.646408" elapsed="0.003969">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:37.644316" elapsed="0.006144">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.650649" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:37.650494" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:37.644297" elapsed="0.006459">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.651125" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.651257" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:37.651220" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:37.651202" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.651457" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.651527" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:37.639133" elapsed="0.012500">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.651719" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-04-25T23:57:37.636690" elapsed="0.015128">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.651985" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:37.652150" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:37.652213" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:37.623166" elapsed="0.029146">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.652475" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:37.622719" elapsed="0.029866">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:37.660093" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:37.663704" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:37.622207" elapsed="0.041621">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:38.681611" 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-04-25T23:57:38.679027" elapsed="0.002611"/>
</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-04-25T23:57:38.681974" elapsed="0.000021"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:38.681823" elapsed="0.000208"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:38.681707" elapsed="0.000350"/>
</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-04-25T23:57:38.682353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:38.682117" elapsed="0.000292"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:38.683146" level="INFO">${uri} = /restconf/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-04-25T23:57:38.682672" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:38.682433" 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-04-25T23:57:38.683391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:38.683232" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:38.682100" elapsed="0.001366"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:38.683499" elapsed="0.000028"/>
</return>
<msg time="2026-04-25T23:57:38.683665" level="INFO">${uri} = /restconf/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-04-25T23:57:38.678377" elapsed="0.005315"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:38.683737" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:38.683879" level="INFO">${uri} = /restconf/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-04-25T23:57:38.677719" elapsed="0.006184"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:38.692629" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:38.692374" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:38.693089" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:38.692844" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:38.697804" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:38.695254" elapsed="0.004154">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:38.693200" elapsed="0.006290">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.699696" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:38.699524" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:38.693181" elapsed="0.006603">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.700181" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:38.700343" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:38.700306" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:38.700288" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.700542" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:38.700610" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:38.688001" elapsed="0.012732">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:38.700805" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:38.684115" elapsed="0.016786">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.701068" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:38.701232" elapsed="0.000019"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:38.701294" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-25T23:57:38.666758" elapsed="0.034632">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.701551" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:38.665723" elapsed="0.035952">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:38.708967" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:38.712544" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:38.664480" elapsed="0.048201">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:39.733912" 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-04-25T23:57:39.731716" 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-04-25T23:57:39.734315" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:39.734161" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:39.734025" elapsed="0.000377"/>
</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-04-25T23:57:39.734767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:39.734477" 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-04-25T23:57:39.735647" level="INFO">${uri} = /restconf/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-04-25T23:57:39.735170" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:39.734852" 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-04-25T23:57:39.735932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:39.735763" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:39.734454" elapsed="0.001554"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:39.736046" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:57:39.736213" level="INFO">${uri} = /restconf/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-04-25T23:57:39.731212" elapsed="0.005027"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:39.736286" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:39.736428" level="INFO">${uri} = /restconf/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-04-25T23:57:39.730698" elapsed="0.005755"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:39.744241" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:39.743975" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:39.744703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:39.744439" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:39.749598" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:39.746903" elapsed="0.004419">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:39.744822" elapsed="0.006588">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.751598" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:39.751444" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:39.744804" elapsed="0.006900">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.752098" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:39.752228" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:39.752191" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:39.752175" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.752429" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:39.752497" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:39.739149" elapsed="0.013461">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:39.752698" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:39.736687" elapsed="0.016116">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.752976" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:39.753190" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:39.753254" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:39.716087" elapsed="0.037268">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.753519" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:39.714993" elapsed="0.038640">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:39.761122" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:39.764727" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:39.713557" elapsed="0.051294">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:40.783136" 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-04-25T23:57:40.780954" 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-04-25T23:57:40.783588" elapsed="0.000024"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:40.783412" elapsed="0.000256"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:40.783258" elapsed="0.000440"/>
</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-04-25T23:57:40.784037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:40.783771" 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-04-25T23:57:40.784843" level="INFO">${uri} = /restconf/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-04-25T23:57:40.784348" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:40.784118" 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-04-25T23:57:40.785099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:40.784937" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:40.783750" elapsed="0.001425"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:40.785212" elapsed="0.000039"/>
</return>
<msg time="2026-04-25T23:57:40.785375" level="INFO">${uri} = /restconf/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-04-25T23:57:40.780459" elapsed="0.004941"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:40.785447" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:40.785592" level="INFO">${uri} = /restconf/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-04-25T23:57:40.779954" elapsed="0.005663"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:40.793243" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:40.792979" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:40.793702" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:40.793442" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:40.798736" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:40.795946" elapsed="0.004537">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:40.793818" elapsed="0.006753">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.800771" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:40.800604" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:40.793799" elapsed="0.007061">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.801237" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:40.801369" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:40.801332" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:40.801315" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.801571" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:40.801645" 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-04-25T23:57:40.788359" elapsed="0.013414">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:40.801845" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:40.785849" elapsed="0.016099">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.802117" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:40.802282" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:40.802343" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:40.768240" elapsed="0.034201">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.802603" elapsed="0.000024"/>
</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="FAIL" start="2026-04-25T23:57:40.767083" elapsed="0.035654">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:40.810021" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:40.813639" elapsed="0.000038"/>
</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="FAIL" start="2026-04-25T23:57:40.765687" elapsed="0.048090">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:41.831284" 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-04-25T23:57:41.829149" 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-04-25T23:57:41.831645" elapsed="0.000036"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:41.831494" elapsed="0.000223"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:41.831372" elapsed="0.000371"/>
</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-04-25T23:57:41.832053" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:41.831808" 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-04-25T23:57:41.832854" level="INFO">${uri} = /restconf/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-04-25T23:57:41.832361" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:41.832132" 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-04-25T23:57:41.833106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:41.832943" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:41.831790" elapsed="0.001392"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:41.833216" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:41.833368" level="INFO">${uri} = /restconf/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-04-25T23:57:41.828689" elapsed="0.004704"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:41.833439" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:41.833580" level="INFO">${uri} = /restconf/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-04-25T23:57:41.828187" elapsed="0.005418"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:41.840911" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:41.840643" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:41.841349" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:41.841109" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:41.846066" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:41.843538" elapsed="0.004189">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:41.841458" elapsed="0.006353">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.847997" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:41.847844" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:41.841440" elapsed="0.006644">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.848459" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:41.848588" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:41.848551" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:41.848535" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.848856" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:41.848926" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:41.836288" elapsed="0.012746">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:41.849105" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:41.833837" elapsed="0.015364">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.849367" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:41.849531" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:41.849592" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:41.816805" elapsed="0.032905">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.849874" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:41.815734" elapsed="0.034249">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:41.857399" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:41.861003" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:41.814464" elapsed="0.046663">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:42.878762" 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-04-25T23:57:42.876529" elapsed="0.002268"/>
</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-04-25T23:57:42.879165" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:42.879009" elapsed="0.000214"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:42.878874" 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-04-25T23:57:42.879590" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:42.879326" 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-04-25T23:57:42.880403" level="INFO">${uri} = /restconf/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-04-25T23:57:42.879928" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:42.879690" 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-04-25T23:57:42.880665" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:42.880491" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:42.879304" elapsed="0.001531"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:42.880879" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:57:42.881052" level="INFO">${uri} = /restconf/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-04-25T23:57:42.876039" elapsed="0.005039"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:42.881126" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:42.881270" level="INFO">${uri} = /restconf/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-04-25T23:57:42.875512" elapsed="0.005782"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:42.888897" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:42.888618" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:42.889345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:42.889100" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:42.894180" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:42.891542" elapsed="0.004360">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:42.889455" elapsed="0.006533">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.896174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:42.896022" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:42.889437" elapsed="0.006825">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.896637" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:42.896789" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:42.896752" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:42.896736" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.896990" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:42.897058" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:42.883965" elapsed="0.013198">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:42.897233" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:42.881513" elapsed="0.015815">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.897492" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:42.897672" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:42.897736" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:42.864515" elapsed="0.033317">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.898032" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:57:42.863458" elapsed="0.034685">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:42.905318" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:42.909303" elapsed="0.000027"/>
</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="FAIL" start="2026-04-25T23:57:42.862011" elapsed="0.047418">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:43.926783" 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-04-25T23:57:43.924609" elapsed="0.002206"/>
</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-04-25T23:57:43.927161" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:43.927007" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:43.926882" elapsed="0.000364"/>
</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-04-25T23:57:43.927574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:43.927314" 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-04-25T23:57:43.928382" level="INFO">${uri} = /restconf/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-04-25T23:57:43.927906" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:43.927669" 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-04-25T23:57:43.928632" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:43.928470" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:43.927294" elapsed="0.001430"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:43.928759" elapsed="0.000034"/>
</return>
<msg time="2026-04-25T23:57:43.928916" level="INFO">${uri} = /restconf/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-04-25T23:57:43.924135" elapsed="0.004806"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:43.928988" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:43.929129" level="INFO">${uri} = /restconf/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-04-25T23:57:43.923626" elapsed="0.005528"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:43.936534" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:43.936273" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:43.936993" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:43.936748" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:43.941897" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:43.939173" elapsed="0.004417">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:43.937102" elapsed="0.006644">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.943935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:43.943782" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:43.937084" elapsed="0.006939">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.944391" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:43.944523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:43.944486" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:43.944469" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.944738" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:43.944808" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:43.931885" elapsed="0.013029">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:43.944985" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:43.929373" elapsed="0.015708">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.945251" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:43.945415" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:43.945476" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:43.912705" elapsed="0.032870">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.945751" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:57:43.911644" elapsed="0.034218">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:43.953219" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:43.956921" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:43.910301" elapsed="0.046744">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:44.975600" 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-04-25T23:57:44.972917" elapsed="0.002715"/>
</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-04-25T23:57:44.976116" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:44.975961" elapsed="0.000213"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:44.975828" elapsed="0.000374"/>
</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-04-25T23:57:44.976529" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:44.976271" 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-04-25T23:57:44.977340" level="INFO">${uri} = /restconf/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-04-25T23:57:44.976862" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:44.976610" 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-04-25T23:57:44.977593" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:44.977430" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:44.976252" elapsed="0.001435"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:44.977739" elapsed="0.000040"/>
</return>
<msg time="2026-04-25T23:57:44.977905" level="INFO">${uri} = /restconf/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-04-25T23:57:44.972250" elapsed="0.005681"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:44.977978" elapsed="0.000027"/>
</return>
<msg time="2026-04-25T23:57:44.978121" level="INFO">${uri} = /restconf/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-04-25T23:57:44.971551" elapsed="0.006595"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:44.985538" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:44.985279" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:44.986018" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:44.985770" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:44.990964" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:44.988202" elapsed="0.004413">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:44.986130" elapsed="0.006586">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:44.992902" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:44.992750" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:44.986110" elapsed="0.006879">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:44.993364" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:44.993495" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:44.993458" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:44.993441" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:44.993743" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:44.993814" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:44.980935" elapsed="0.012985">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:44.994030" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:44.978362" elapsed="0.015768">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:44.994301" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:44.994469" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:44.994531" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:44.960240" elapsed="0.034390">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:44.994811" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:44.959198" elapsed="0.035722">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:45.002275" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:45.005862" elapsed="0.000028"/>
</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="FAIL" start="2026-04-25T23:57:44.957856" elapsed="0.048138">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:46.025119" 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-04-25T23:57:46.022979" 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-04-25T23:57:46.025515" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:46.025349" elapsed="0.000223"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:46.025221" elapsed="0.000379"/>
</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-04-25T23:57:46.025942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:46.025683" 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-04-25T23:57:46.026741" level="INFO">${uri} = /restconf/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-04-25T23:57:46.026249" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:46.026023" 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-04-25T23:57:46.027000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:46.026837" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:46.025649" elapsed="0.001427"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:46.027111" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:57:46.027271" level="INFO">${uri} = /restconf/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-04-25T23:57:46.022478" elapsed="0.004819"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:46.027344" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:46.027486" level="INFO">${uri} = /restconf/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-04-25T23:57:46.021975" elapsed="0.005608"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:46.035073" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:46.034813" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:46.035511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:46.035270" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:46.040445" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:46.037720" elapsed="0.004410">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:46.035620" elapsed="0.006596">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.042401" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:46.042250" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:46.035602" elapsed="0.006886">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.042872" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:46.043004" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:46.042967" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:46.042951" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.043207" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:46.043276" 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-04-25T23:57:46.030354" elapsed="0.013027">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:46.043452" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:46.027826" elapsed="0.015724">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.043733" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:46.043900" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:46.043963" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-25T23:57:46.009194" elapsed="0.034866">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.044223" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:46.008144" elapsed="0.036186">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:46.051801" elapsed="0.000033"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:46.055389" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:46.006836" elapsed="0.048682">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:47.073591" 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-04-25T23:57:47.071452" elapsed="0.002170"/>
</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-04-25T23:57:47.073987" elapsed="0.000022"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:47.073833" elapsed="0.000212"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:47.073703" 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-04-25T23:57:47.074402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:47.074141" 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-04-25T23:57:47.075206" level="INFO">${uri} = /restconf/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-04-25T23:57:47.074725" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:47.074482" 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-04-25T23:57:47.075459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:47.075295" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:47.074121" elapsed="0.001419"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:47.075576" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:57:47.075750" level="INFO">${uri} = /restconf/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-04-25T23:57:47.070980" elapsed="0.004796"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:47.075824" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:47.075967" level="INFO">${uri} = /restconf/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-04-25T23:57:47.070471" elapsed="0.005521"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:47.085236" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:47.084938" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:47.085736" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:47.085468" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:47.090553" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:47.087951" elapsed="0.004268">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:47.085857" elapsed="0.006448">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:47.092491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:47.092339" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:47.085837" elapsed="0.006795">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:47.093034" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:47.093167" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:47.093130" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:47.093114" 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-04-25T23:57:47.093386" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:47.093455" 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-04-25T23:57:47.080495" elapsed="0.013073">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:47.093640" elapsed="0.000031"/>
</return>
<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="FAIL" start="2026-04-25T23:57:47.076208" elapsed="0.017547">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:47.093929" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:47.094093" elapsed="0.000020"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:47.094156" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-04-25T23:57:47.058768" elapsed="0.035494">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:47.094424" elapsed="0.000021"/>
</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="FAIL" start="2026-04-25T23:57:47.057724" elapsed="0.036808">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:47.101851" elapsed="0.000027"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:47.105419" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:47.056341" elapsed="0.049201">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-25T23:57:48.124730" 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-04-25T23:57:48.122565" elapsed="0.002197"/>
</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-04-25T23:57:48.125121" elapsed="0.000023"/>
</kw>
<var name="${nv}"/>
<status status="NOT RUN" start="2026-04-25T23:57:48.124966" elapsed="0.000213"/>
</iter>
<var>${nv}</var>
<value>@{node_value_list}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.124830" elapsed="0.000377"/>
</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-04-25T23:57:48.125536" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:48.125275" elapsed="0.000396"/>
</branch>
<branch type="ELSE IF" condition="&quot;${datastore_flag}&quot;==&quot;operational&quot;">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.126419" level="INFO">${uri} = /restconf/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-04-25T23:57:48.125933" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:48.125697" 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-04-25T23:57:48.126688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:48.126509" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.125255" elapsed="0.001511"/>
</if>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:48.126802" elapsed="0.000037"/>
</return>
<msg time="2026-04-25T23:57:48.126964" level="INFO">${uri} = /restconf/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-04-25T23:57:48.122090" elapsed="0.004900"/>
</kw>
<return>
<value>${uri}</value>
<status status="PASS" start="2026-04-25T23:57:48.127038" elapsed="0.000026"/>
</return>
<msg time="2026-04-25T23:57:48.127181" level="INFO">${uri} = /restconf/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-04-25T23:57:48.121578" elapsed="0.005629"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.134500" level="INFO">/restconf/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.134239" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.134963" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.134713" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:48.139629" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:57:48.137149" elapsed="0.004197">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:48.135074" elapsed="0.006357">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.141616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:48.141464" elapsed="0.000251"/>
</branch>
<status status="FAIL" start="2026-04-25T23:57:48.135056" elapsed="0.006685">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.142116" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.142247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:48.142210" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:48.142193" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.142450" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.142518" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:57:48.129887" elapsed="0.012738">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.142716" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:48.127435" elapsed="0.015380">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${mounts}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.143019" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-04-25T23:57:48.143189" elapsed="0.000021"/>
</kw>
<return>
<value>${actual_count}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.143253" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-25T23:57:48.108858" elapsed="0.034496">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${count}</arg>
<arg>0</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.143547" elapsed="0.000022"/>
</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="FAIL" start="2026-04-25T23:57:48.107796" elapsed="0.035877">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Generate URI" owner="Restconf">
<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="NOT RUN" start="2026-04-25T23:57:48.151127" elapsed="0.000028"/>
</kw>
<kw name="No Content From URI" owner="Utils">
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Issue a Get On Session and return on error 404 (No content) or will fail and log the content.
Issues a Get On Session for ${uri} in default using headers from
{'Content-Type': 'application/json'}. If the request returns a HTTP error, fails. Otherwise
returns the data obtained by the request.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.154708" elapsed="0.000026"/>
</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="FAIL" start="2026-04-25T23:57:48.106360" elapsed="0.048473">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-25T23:57:48.154933" level="FAIL">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-25T23:57:37.621643" elapsed="10.533386">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${DEVICE_NAME}</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="FAIL" start="2026-04-25T23:57:37.621240" elapsed="10.533901">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Check that the device is really going to be gone. Fail
if found after one minute. This is an expected behavior as the
delete request is sent to the config subsystem which then triggers
asynchronous destruction of the netconf connector referring to the
device and the device's data. This test makes sure this
asynchronous operation does not take unreasonable amount of time
by making sure that both the netconf connector and the device's
data is gone before reporting success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:37.560478" elapsed="10.594817">Keyword 'Check_Device_Completely_Gone' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/data/network-topology:network-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:48.156373" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:57:48.156297" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_Testtool" owner="NetconfKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.158192" 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-04-25T23:57:48.157680" elapsed="0.000541"/>
</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-04-25T23:57:48.158375" elapsed="0.000310"/>
</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-04-25T23:57:48.157295" elapsed="0.001451"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.352775" level="INFO">[?2004l^C[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-04-25T23:57:48.158892" elapsed="0.194167"/>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.361834" level="INFO">'testtool--netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION.1777161430.435.log' -&gt; '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/testtool--netconf-gate-userfeatures-netty-txt-CRUD-ACTION-CRUD-ACTION.1777161430.435.log'</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="PASS" start="2026-04-25T23:57:48.353366" elapsed="0.008557"/>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="PASS" start="2026-04-25T23:57:48.157041" elapsed="0.204979"/>
</kw>
<arg>NetconfKeywords.Stop_Testtool</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:48.156621" elapsed="0.205466"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-25T23:57:48.156078" elapsed="0.206086"/>
</kw>
<doc>netconf-connector CRUD-Action test suite.

Copyright (c) 2019 Ericsson Software Technology AB. 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 using RPC for node supporting Yang 1.1
addition and see if invoking Action Operation work.</doc>
<status status="FAIL" start="2026-04-25T23:57:04.187291" elapsed="44.174921"/>
</suite>
<status status="FAIL" start="2026-04-25T23:57:04.185723" elapsed="44.177914"/>
</suite>
<suite id="s1-s6" name="Notifications" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications">
<suite id="s1-s6-s1" name="Notifications Basic" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.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-04-25T23:57:48.459865" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:48.455553" elapsed="0.004365"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:57:48.455319" elapsed="0.004668"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.464872" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:48.461098" elapsed="0.003809"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:57:48.465133" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:48.465001" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.464972" elapsed="0.000235"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.465736" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:48.465365" elapsed="0.000414"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.466250" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:48.465941" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:57:48.466803" elapsed="0.000341"/>
</kw>
<msg time="2026-04-25T23:57:48.467245" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:48.467291" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:48.466442" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.467879" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:48.467484" elapsed="0.000422"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.468957" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:48.468672" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.469388" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:48.469132" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.469895" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.469571" elapsed="0.000351"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.473245" elapsed="0.000217"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.473966" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:48.473623" 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-04-25T23:57:48.474146" elapsed="0.000230"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.475170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:48.474877" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:57:48.475241" elapsed="0.000041"/>
</return>
<msg time="2026-04-25T23:57:48.475480" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:48.474567" elapsed="0.000939"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:48.476116" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc390710&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:48.475679" elapsed="0.000576"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.476417" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-25T23:57:48.472667" elapsed="0.004014"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:48.472460" elapsed="0.004267"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:57:48.469985" elapsed="0.006775"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.477354" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:48.476951" elapsed="0.000445"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.477972" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:48.477559" elapsed="0.000454"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.478555" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:48.478174" elapsed="0.000422"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:57:48.468205" elapsed="0.010466"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:57:48.460742" elapsed="0.017988"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.478909" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:48.478796" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.478777" elapsed="0.000196"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.482103" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:48.481722" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.482579" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:48.482287" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:48.482647" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:57:48.482819" 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-04-25T23:57:48.481383" elapsed="0.001460"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:48.483834" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.483553" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.484577" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.484741" level="INFO">${current_connection} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.484438" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.488528" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:48.487873" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.487829" elapsed="0.000889"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.489351" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.489691" level="INFO">${current_ssh_connection} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.489019" elapsed="0.000777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.490707" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.490063" elapsed="0.000831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.491939" level="INFO">${conn_id} = 106</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.491167" elapsed="0.000871"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.493596" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:48.493700" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:48.493278" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.493973" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.495493" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:48.797822" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:57:09 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:48.495166" elapsed="0.302797"/>
</kw>
<msg time="2026-04-25T23:57:48.798044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.494761" elapsed="0.303367"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:48.492464" elapsed="0.305884"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.799225" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:57:48.811618" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:57:48.812269" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:57:48.812584" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:57:48.798742" elapsed="0.014122"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:48.813486" elapsed="0.001121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.817246" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.815998" elapsed="0.001597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.818600" elapsed="0.000094"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:48.817969" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.817859" elapsed="0.001113"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:57:48.819878" elapsed="0.000136"/>
</return>
<status status="PASS" start="2026-04-25T23:57:48.819284" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.819193" elapsed="0.001082"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.820473" 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-04-25T23:57:48.827117" elapsed="0.000214"/>
</kw>
<msg time="2026-04-25T23:57:48.827392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.826254" elapsed="0.001274"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.827919" elapsed="0.000062"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.828311" elapsed="0.000049"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:48.821940" elapsed="0.006576"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:57:48.486836" elapsed="0.342253"/>
</kw>
<msg time="2026-04-25T23:57:48.829242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.485968" elapsed="0.343347"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:48.485477" elapsed="0.343950"/>
</kw>
<msg time="2026-04-25T23:57:48.829485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.484971" elapsed="0.344577"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:48.833798" elapsed="0.000192"/>
</kw>
<msg time="2026-04-25T23:57:48.834033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.833284" elapsed="0.000811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.834253" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.834414" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:48.829984" elapsed="0.004510"/>
</kw>
<msg time="2026-04-25T23:57:48.834586" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:57:48.484079" elapsed="0.350531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.835110" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.834858" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:48.835193" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:57:48.483200" elapsed="0.352117"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:48.483021" elapsed="0.352362"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:48.482895" elapsed="0.352532"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:57:48.479192" elapsed="0.356295"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:57:48.835644" elapsed="0.000225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:48.849553" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:48.849442" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.849423" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.849912" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.850016" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:48.849787" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.850450" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.850194" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:48.850918" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:48.850643" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:48.851747" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:57:48.851496" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:57:48.851966" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:48.852011" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:48.851138" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.852335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:48.852110" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:48.852091" elapsed="0.000605"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:48.853472" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.853205" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:48.853546" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:48.853714" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:48.852926" elapsed="0.000813"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.853900" elapsed="0.000622"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.854842" level="INFO">index=107
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:48.854717" elapsed="0.000278"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:48.855146" elapsed="0.002224"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:48.857819" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:48.858744" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:48.857537" elapsed="0.001622">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:48.862735" elapsed="0.000222"/>
</kw>
<msg time="2026-04-25T23:57:48.863102" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:48.862153" elapsed="0.001013"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.863323" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:48.863485" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:48.859971" elapsed="0.003594"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:48.859440" elapsed="0.004171"/>
</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="FAIL" start="2026-04-25T23:57:48.849166" elapsed="0.014551">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:49.882314" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:49.882161" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:49.882131" elapsed="0.000278"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:49.882807" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:49.882936" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:49.882607" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:49.883448" level="INFO">{1: 107}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:49.883124" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:49.883905" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:49.883646" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:49.884545" elapsed="0.000206"/>
</kw>
<msg time="2026-04-25T23:57:49.884861" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:49.884908" level="INFO">${old_connection_index} = 107</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:49.884120" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:49.885869" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:49.886784" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:49.886566" elapsed="0.000880">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:49.886233" elapsed="0.001351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:49.888120" 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-04-25T23:57:49.887774" elapsed="0.000551"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:49.885326" elapsed="0.003046"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:49.885098" elapsed="0.003335"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:49.885078" elapsed="0.003381"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:49.889236" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:49.888968" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:49.889311" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:49.889469" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:49.888689" elapsed="0.000804"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:49.889650" elapsed="0.000679"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:49.890613" level="INFO">index=108
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:49.890500" elapsed="0.000256"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:49.890904" elapsed="0.002225"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:49.893553" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:49.894771" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:49.893292" elapsed="0.001857">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:49.898822" elapsed="0.000222"/>
</kw>
<msg time="2026-04-25T23:57:49.899189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:49.898185" elapsed="0.001068"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:49.899416" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:49.899580" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:49.895996" elapsed="0.003681"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:49.895435" elapsed="0.004288"/>
</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="FAIL" start="2026-04-25T23:57:49.881709" elapsed="0.018095">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:50.913477" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:50.913331" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:50.913303" elapsed="0.000267"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:50.913978" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:50.914106" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:50.913787" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:50.914733" level="INFO">{1: 108}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:50.914395" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:50.915180" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:50.914933" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:50.915798" elapsed="0.000189"/>
</kw>
<msg time="2026-04-25T23:57:50.916089" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:50.916161" level="INFO">${old_connection_index} = 108</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:50.915389" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:50.917028" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:50.917941" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:50.917746" elapsed="0.000837">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:50.917394" elapsed="0.001344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:50.919239" 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-04-25T23:57:50.918913" elapsed="0.000529"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:50.916490" elapsed="0.002998"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:50.916262" elapsed="0.003276"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:50.916243" elapsed="0.003321"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:50.920345" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:50.920062" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:50.920418" elapsed="0.000260"/>
</return>
<msg time="2026-04-25T23:57:50.920816" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:50.919787" elapsed="0.001054"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:50.920999" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:50.921727" level="INFO">index=109
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:50.921599" elapsed="0.000254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:50.922002" elapsed="0.002206"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:50.924634" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:50.925953" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:50.924371" elapsed="0.001958">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:50.929999" elapsed="0.000222"/>
</kw>
<msg time="2026-04-25T23:57:50.930365" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:50.929354" elapsed="0.001076"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:50.930587" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:50.930766" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:50.927169" elapsed="0.003678"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:50.926609" elapsed="0.004284"/>
</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="FAIL" start="2026-04-25T23:57:50.912897" elapsed="0.018112">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:51.950791" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:51.950626" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:51.950595" elapsed="0.000291"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:51.951280" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:51.951407" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:51.951096" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:51.951948" level="INFO">{1: 109}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:51.951597" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:51.952395" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:51.952148" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:51.953030" elapsed="0.000190"/>
</kw>
<msg time="2026-04-25T23:57:51.953321" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:51.953367" level="INFO">${old_connection_index} = 109</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:51.952606" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:51.954229" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:51.955133" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:51.954943" elapsed="0.000868">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:51.954587" elapsed="0.001364"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:51.956448" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:51.956124" elapsed="0.000525"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:51.953710" elapsed="0.003002"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:51.953471" elapsed="0.003290"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:51.953447" elapsed="0.003340"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:51.959460" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:51.959181" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:51.959535" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:57:51.959716" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:51.956994" elapsed="0.002748"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:51.959920" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:51.960637" level="INFO">index=110
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:51.960525" elapsed="0.000256"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:51.960928" elapsed="0.002221"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:51.963573" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:51.964795" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:51.963313" elapsed="0.001860">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:51.968888" elapsed="0.000221"/>
</kw>
<msg time="2026-04-25T23:57:51.969254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:51.968256" elapsed="0.001063"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:51.969478" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:51.969641" elapsed="0.000034"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:51.966058" elapsed="0.003689"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:51.965503" elapsed="0.004289"/>
</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="FAIL" start="2026-04-25T23:57:51.950166" elapsed="0.019707">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:51.969963" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:57:48.836586" elapsed="3.133468">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:48.836223" elapsed="3.133896"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:48.836082" elapsed="3.134078"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:57:48.835931" elapsed="3.134265"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:57:48.460289" elapsed="3.509963"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:51.972905" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:51.972793" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:51.972774" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:51.977796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:51.977688" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:51.977669" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:51.978810" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:51.978415" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:51.979297" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:51.979000" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:51.979366" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:51.979521" 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-04-25T23:57:51.978087" elapsed="0.001458"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.031025" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.030879" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.030851" elapsed="0.000265"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.032719" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.032510" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.032491" elapsed="0.000375"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.033458" level="INFO">${karaf_connection_index} = 110</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.033014" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.034005" level="INFO">${current_connection_index} = 92</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.033755" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.036214" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.035679" elapsed="0.001146">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:52.036990" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:52.037063" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.034271" elapsed="0.002830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.039166" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.038760" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:52.039905" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:52.039980" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.037356" elapsed="0.002661"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.041133" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.040497" elapsed="0.000809">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:52.040178" elapsed="0.001266">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:52.040157" elapsed="0.001337">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.041778" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.042098" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:52.041929" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:52.041910" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.042299" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.044738" elapsed="0.000278"/>
</kw>
<msg time="2026-04-25T23:57:52.045076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.044163" 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-04-25T23:57:52.045347" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.045554" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.043478" elapsed="0.002363"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:52.042572" 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="FAIL" start="2026-04-25T23:57:52.032093" elapsed="0.013930">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot"</status>
</kw>
<msg time="2026-04-25T23:57:52.046127" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:52.046172" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/notifications_basic.robot...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.031311" elapsed="0.014885"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.046380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.046272" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.046253" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.047248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.047143" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.047125" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.047591" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:52.047711" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:52.047465" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.048234" level="INFO">{1: 110}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.047949" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.048710" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.048432" 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-04-25T23:57:52.049283" elapsed="0.000353"/>
</kw>
<msg time="2026-04-25T23:57:52.049893" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:52.049940" level="INFO">${old_connection_index} = 110</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.048921" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.051132" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.052579" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.052424" elapsed="0.000605">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.051750" elapsed="0.001366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.054136" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.053386" elapsed="0.000927"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:52.050262" elapsed="0.004130"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:52.050040" elapsed="0.004403"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.050021" elapsed="0.004448"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.055472" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.054986" elapsed="0.000513"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:52.055585" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:52.055766" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.054687" elapsed="0.001105"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.055947" elapsed="0.000478"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.056721" level="INFO">index=111
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.056594" elapsed="0.000262"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.057003" elapsed="0.014215"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.071709" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:52.072746" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.071386" elapsed="0.001746">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.077938" elapsed="0.000153"/>
</kw>
<msg time="2026-04-25T23:57:52.078162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.076623" 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-04-25T23:57:52.078533" elapsed="0.000064"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.078855" elapsed="0.000063"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.074182" elapsed="0.004832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:52.073409" elapsed="0.005653"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.046896" elapsed="0.032285">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.079569" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.079644" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.030396" elapsed="0.049396">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:52.079900" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:52.079944" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:51.979968" elapsed="0.100000"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.080303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:52.080046" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.080028" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:51.979823" elapsed="0.100582"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:51.979604" elapsed="0.100834"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:51.977387" elapsed="0.103110"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:57:51.970852" elapsed="0.109701"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:51.970406" elapsed="0.110189"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:57:48.455002" elapsed="3.625643"/>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.094780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.094669" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.094639" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.095115" level="INFO">index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:52.095223" level="INFO">${current_ssh_connection_object} = index=92
host=10.30.171.48
alias=None
port=22
timeout=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-04-25T23:57:52.094999" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.095674" level="INFO">{1: 111}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.095403" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.096128" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.095882" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.096696" elapsed="0.000181"/>
</kw>
<msg time="2026-04-25T23:57:52.096973" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:52.097018" level="INFO">${old_connection_index} = 111</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.096327" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.097845" elapsed="0.000140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.098616" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.098470" 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-04-25T23:57:52.098149" elapsed="0.000970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.099605" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.099285" elapsed="0.000487"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:52.097331" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:52.097114" elapsed="0.002784"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.097096" elapsed="0.002828"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.100690" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.100405" elapsed="0.000312"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:52.100765" elapsed="0.000208"/>
</return>
<msg time="2026-04-25T23:57:52.101103" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.100128" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.101285" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.101985" level="INFO">index=112
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.101873" 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-04-25T23:57:52.102260" elapsed="0.002186"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.104882" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:52.105781" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.104610" elapsed="0.001539">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.109616" elapsed="0.000177"/>
</kw>
<msg time="2026-04-25T23:57:52.109836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.109133" elapsed="0.000761"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.110050" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.110211" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.106950" elapsed="0.003340"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:52.106419" elapsed="0.003916"/>
</kw>
<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="FAIL" start="2026-04-25T23:57:52.092916" elapsed="0.017494">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.114449" elapsed="0.000026"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/../../../../tools/wstools/wsreceiver.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.114628" elapsed="0.000020"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/notifications/../../../../tools/wstools/ssereceiver.py</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.114808" elapsed="0.000021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>sudo apt-get install -y python3-pip</arg>
<arg>return_stdout=True</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.114978" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.115155" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.115314" elapsed="0.000019"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>python3 -m pip install --user --upgrade pip setuptools wheel packaging ordered-set more_itertools jaraco.text importlib_resources importlib_metadata tomli platformdirs</arg>
<arg>return_stdout=True</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.115478" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.115650" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.115846" elapsed="0.000021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>python3 -m pip install --user websocket-client asyncio aiohttp aiohttp-sse-client coroutine</arg>
<arg>return_stdout=True</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.116012" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.116225" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.116388" elapsed="0.000019"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<arg>restconf</arg>
<arg>http://${ODL_SYSTEM_IP}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.116551" elapsed="0.000019"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<arg>log:set ${CONTROLLER_LOG_LEVEL}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.116925" elapsed="0.000025"/>
</kw>
<doc>SSH-login to mininet machine, create HTTP session,
prepare directories for responses, put Python tool to mininet machine, setup imported resources.</doc>
<status status="FAIL" start="2026-04-25T23:57:48.454649" elapsed="3.662393">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<test id="s1-s6-s1-t1" name="Create_DCN_Stream" line="62">
<doc>Create DCN stream.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.117125" elapsed="0.000440">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t2" name="Subscribe_To_DCN_Stream" line="82">
<doc>Subscribe to DCN streams.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.117858" elapsed="0.000361">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t3" name="List_DCN_Streams" line="97">
<doc>List DCN streams.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.118467" elapsed="0.000350">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t4" name="Start_Receiver" line="109">
<doc>Start the WSS/SSE listener</doc>
<status status="FAIL" start="2026-04-25T23:57:52.119082" elapsed="0.000325">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t5" name="Change_DS_Config" line="116">
<doc>Make a change in DS configuration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.119647" elapsed="0.000375">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t6" name="Check_Notification" line="133">
<doc>Check the WSS/SSE listener log for a change notification.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.120262" elapsed="0.000402">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t7" name="Check_Delete_Notification" line="148">
<doc>Check the WSS/SSE listener log for a delete notification.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.120920" elapsed="0.000397">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<test id="s1-s6-s1-t8" name="Check_Bug_3934" line="153">
<doc>Check the WSS/SSE listener log for the bug correction.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:57:52.121565" elapsed="0.000384">Parent suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:52.122710" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:57:52.122620" elapsed="0.000168"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-25T23:57:52.122937" elapsed="0.000586"/>
</kw>
<doc>Close connections.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-04-25T23:57:52.122403" elapsed="0.001177"/>
</kw>
<doc>Basic tests for BGP application peer.

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

Test suite performs basic subscribtion case for data store notifications.
For procedure description see the
https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:Restconf:Change_event_notification_subscription


This suite uses inventory (config part) as an area to make dummy writes into,
just to trigger data change listener to produce a notification.
Openflowplugin may have some data there, and before Boron, netconf-connector
was also exposing some data in inventory.

To avoid unexpected responses, this suite depetes all data from config inventory,
so this suite should not be followed by any suite expecting default data there.

Covered bugs:
Bug 3934 - Websockets: Scope ONE doesn't work correctly

TODO: Use cars/people model for data</doc>
<status status="FAIL" start="2026-04-25T23:57:48.366108" elapsed="3.757503">Suite setup failed:
NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</suite>
<status status="FAIL" start="2026-04-25T23:57:48.364324" elapsed="3.760217"/>
</suite>
<suite id="s1-s7" name="KeyAuth" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth">
<suite id="s1-s7-s1" name="Keyauth" source="/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot">
<kw name="Suite Setup" type="SETUP">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.210453" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:52.206133" elapsed="0.004367"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-25T23:57:52.205914" elapsed="0.004647"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.215411" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:52.211614" elapsed="0.003825"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-25T23:57:52.215623" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.215517" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.215495" elapsed="0.000227"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.216230" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:52.215875" elapsed="0.000438"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.216802" level="INFO">${cluster_size} = 1</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-25T23:57:52.216474" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-25T23:57:52.217320" elapsed="0.000276"/>
</kw>
<msg time="2026-04-25T23:57:52.217706" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:52.217754" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.216990" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.218309" level="INFO">${int_of_members} = 1</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:52.217942" elapsed="0.000393"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.219302" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:52.219041" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.219751" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:52.219473" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.220215" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.219932" elapsed="0.000309"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.223521" elapsed="0.000246"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.224257" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:52.223929" 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-04-25T23:57:52.224433" elapsed="0.000239"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.225450" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:57:52.225157" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-25T23:57:52.225521" elapsed="0.000031"/>
</return>
<msg time="2026-04-25T23:57:52.225688" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.224867" elapsed="0.000847"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:52.226281" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfc3f5550&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:52.225864" elapsed="0.000546"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.226569" 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-04-25T23:57:52.222957" elapsed="0.003884"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:52.222767" elapsed="0.004119"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-25T23:57:52.220297" elapsed="0.006620"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.227475" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:52.227077" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.228106" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.206'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:52.227706" elapsed="0.000442"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.228704" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:52.228307" elapsed="0.000441"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-25T23:57:52.218574" elapsed="0.010231"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-25T23:57:52.211280" elapsed="0.017580"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.229072" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.228925" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.228906" elapsed="0.000235"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.232228" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:52.231849" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.232725" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:52.232412" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:52.232795" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:52.232950" 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-04-25T23:57:52.231504" elapsed="0.001470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.233949" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.233688" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.234676" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:52.234777" level="INFO">${current_connection} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.234542" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.238422" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:52.237788" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.237746" elapsed="0.000845"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.239198" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:52.239462" level="INFO">${current_ssh_connection} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.238875" elapsed="0.000685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.240467" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.239854" elapsed="0.000768"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.241631" level="INFO">${conn_id} = 90</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.240915" elapsed="0.000833"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.243097" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:52.243174" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:52.242825" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.243396" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.244623" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:52.555443" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:57:48 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:52.244302" elapsed="0.311219"/>
</kw>
<msg time="2026-04-25T23:57:52.555592" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.243947" elapsed="0.311725"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:52.242106" elapsed="0.313778"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.556556" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-25T23:57:52.569230" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-25T23:57:52.569873" level="INFO">${stdout} = </msg>
<msg time="2026-04-25T23:57:52.570187" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-25T23:57:52.556168" elapsed="0.014236"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.571056" elapsed="0.001089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.574518" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.573385" elapsed="0.001535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.575888" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.575230" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.575134" elapsed="0.001065"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-25T23:57:52.576760" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-04-25T23:57:52.576391" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.576337" elapsed="0.000673"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.577132" elapsed="0.000022"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.582809" elapsed="0.000211"/>
</kw>
<msg time="2026-04-25T23:57:52.583080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.582032" elapsed="0.001180"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.583552" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.584012" 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-04-25T23:57:52.577912" elapsed="0.006306"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-25T23:57:52.236775" elapsed="0.347784"/>
</kw>
<msg time="2026-04-25T23:57:52.584777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.235952" elapsed="0.348898"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:52.235454" elapsed="0.349506"/>
</kw>
<msg time="2026-04-25T23:57:52.585015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.234958" elapsed="0.350119"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.589129" elapsed="0.000167"/>
</kw>
<msg time="2026-04-25T23:57:52.589338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.588623" 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-04-25T23:57:52.589550" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.589724" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.585471" elapsed="0.004333"/>
</kw>
<msg time="2026-04-25T23:57:52.589893" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-25T23:57:52.234189" elapsed="0.355727"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.590331" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.590086" elapsed="0.000286"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-25T23:57:52.590414" elapsed="0.000062"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-25T23:57:52.233326" elapsed="0.357248"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:52.233152" elapsed="0.357459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:52.233026" elapsed="0.357618"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-25T23:57:52.229362" elapsed="0.361353"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-25T23:57:52.590872" elapsed="0.000206"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:52.604944" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:52.604835" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.604815" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.605272" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:52.605375" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.605160" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.605820" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.605550" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:52.606251" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:52.606011" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.607053" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.606826" elapsed="0.000333">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-25T23:57:52.607265" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:52.607310" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.606446" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.607664" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:52.607407" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:52.607388" elapsed="0.000377"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:52.608499" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.608235" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:52.608572" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:52.608738" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.607964" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.608915" elapsed="0.000580"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.609796" level="INFO">index=91
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:52.609684" elapsed="0.000236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:52.610068" elapsed="0.002193"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:52.612696" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:52.613695" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.612423" elapsed="0.001685">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:52.617711" elapsed="0.000229"/>
</kw>
<msg time="2026-04-25T23:57:52.618091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:52.617136" 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-04-25T23:57:52.618348" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:52.618508" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:52.614916" elapsed="0.003672"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:52.614385" elapsed="0.004250"/>
</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="FAIL" start="2026-04-25T23:57:52.604542" elapsed="0.014194">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:53.638104" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:53.637985" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:53.637965" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:53.638444" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:53.638548" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:53.638327" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:53.639004" level="INFO">{1: 91}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:53.638741" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:53.639453" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:53.639198" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:53.640022" elapsed="0.000180"/>
</kw>
<msg time="2026-04-25T23:57:53.640298" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:53.640343" level="INFO">${old_connection_index} = 91</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:53.639664" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:53.641173" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:53.642022" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:53.641868" elapsed="0.000708">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:53.641518" elapsed="0.001210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:53.643228" elapsed="0.000098"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:53.642899" elapsed="0.000528"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:53.640671" elapsed="0.002802"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:53.640440" elapsed="0.003082"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:53.640422" elapsed="0.003126"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:53.644301" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:53.644036" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:53.644373" elapsed="0.000029"/>
</return>
<msg time="2026-04-25T23:57:53.644522" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:53.643765" elapsed="0.000781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:53.644711" elapsed="0.000561"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:53.645548" level="INFO">index=92
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:53.645438" elapsed="0.000282"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:53.645870" elapsed="0.002208"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:53.648491" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:53.649571" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:53.648236" elapsed="0.001719">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:53.653559" elapsed="0.000237"/>
</kw>
<msg time="2026-04-25T23:57:53.653941" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:53.652979" elapsed="0.001029"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:53.654166" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:53.654324" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:53.650764" elapsed="0.003640"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:53.650224" elapsed="0.004226"/>
</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="FAIL" start="2026-04-25T23:57:53.637699" elapsed="0.016829">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:54.673721" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:54.673570" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:54.673548" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:54.674115" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:54.674229" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:54.673972" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:54.674716" level="INFO">{1: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:54.674408" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:54.675168" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:54.674919" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:54.675769" elapsed="0.000184"/>
</kw>
<msg time="2026-04-25T23:57:54.676053" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:54.676097" level="INFO">${old_connection_index} = 92</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:54.675373" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:54.676938" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:54.677798" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:54.677604" elapsed="0.000803">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:54.677283" elapsed="0.001257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:54.679053" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:54.678724" elapsed="0.000528"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:54.676415" elapsed="0.002883"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:54.676195" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:54.676176" elapsed="0.003195"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:54.681607" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:54.679863" elapsed="0.001834"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:54.681750" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:57:54.681909" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:54.679576" elapsed="0.002357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:54.682085" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:54.682801" level="INFO">index=93
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:54.682688" elapsed="0.000262"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:57:54.683096" elapsed="0.002203"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:54.685732" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:54.686931" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:54.685458" elapsed="0.001856">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:54.690975" elapsed="0.000218"/>
</kw>
<msg time="2026-04-25T23:57:54.691340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:54.690353" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:54.691558" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:54.691735" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:54.688141" elapsed="0.003676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:54.687591" elapsed="0.004273"/>
</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="FAIL" start="2026-04-25T23:57:54.673231" elapsed="0.018714">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.708729" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.708561" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.708536" elapsed="0.000284"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.709161" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:55.709284" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.709004" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.709808" level="INFO">{1: 93}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:55.709465" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.710249" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:55.710004" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.710864" elapsed="0.000186"/>
</kw>
<msg time="2026-04-25T23:57:55.711149" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:55.711196" level="INFO">${old_connection_index} = 93</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.710453" 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-04-25T23:57:55.712044" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.712928" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.712754" elapsed="0.000961">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.712406" elapsed="0.001447"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.714350" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.714024" elapsed="0.000560"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:55.711520" elapsed="0.003112"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:55.711295" elapsed="0.003403"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.711276" elapsed="0.003449"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:55.715704" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.715204" elapsed="0.000527"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:55.715780" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:55.715938" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:55.714930" elapsed="0.001033"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.716114" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.716827" level="INFO">index=94
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.716713" 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-04-25T23:57:55.717106" elapsed="0.002235"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.719779" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:55.720954" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.719502" elapsed="0.001828">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:55.725030" elapsed="0.000220"/>
</kw>
<msg time="2026-04-25T23:57:55.725394" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.724399" 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-04-25T23:57:55.725614" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.725792" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:55.722165" elapsed="0.003708"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:55.721607" elapsed="0.004312"/>
</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="FAIL" start="2026-04-25T23:57:55.708167" elapsed="0.017834">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:55.726090" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<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="FAIL" start="2026-04-25T23:57:52.591837" elapsed="3.134344">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:52.591409" elapsed="3.134836"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:52.591274" elapsed="3.135013"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-25T23:57:52.591133" elapsed="3.135189"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-25T23:57:52.210851" elapsed="3.515529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.729144" elapsed="0.000153"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.729032" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.729013" elapsed="0.000336"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.734281" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.734173" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.734155" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.735311" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:55.734925" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.735807" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-25T23:57:55.735495" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-25T23:57:55.735877" elapsed="0.000030"/>
</return>
<msg time="2026-04-25T23:57:55.736031" 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-04-25T23:57:55.734583" elapsed="0.001473"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.741632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.741522" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.741503" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.743024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.742849" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.742831" elapsed="0.000328"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:55.743729" 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-04-25T23:57:55.743302" elapsed="0.000468"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.744276" level="INFO">${current_connection_index} = 41</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:55.743999" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.746325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.745911" elapsed="0.000938">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:55.747010" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-25T23:57:55.747083" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.744554" elapsed="0.002570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.749163" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.748759" elapsed="0.000975">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-25T23:57:55.749891" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-25T23:57:55.749963" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.747376" elapsed="0.002624"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.751216" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.750476" elapsed="0.000913">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</status>
</kw>
<status status="FAIL" start="2026-04-25T23:57:55.750160" elapsed="0.001360">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</status>
</branch>
<status status="FAIL" start="2026-04-25T23:57:55.750139" elapsed="0.001430">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.751793" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.752147" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:55.751953" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:57:55.751933" elapsed="0.000422"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.752393" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:55.754831" elapsed="0.000169"/>
</kw>
<msg time="2026-04-25T23:57:55.755045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.754287" 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-04-25T23:57:55.755313" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.755516" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:55.753584" elapsed="0.002278"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:55.752668" elapsed="0.003299"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.742462" elapsed="0.013597">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</status>
</kw>
<msg time="2026-04-25T23:57:55.756162" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:55.756207" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/keyauth.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.741867" elapsed="0.014364"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.756419" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.756310" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.756290" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.757456" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:55.757348" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.757329" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.757809" level="INFO">index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-25T23:57:55.757914" level="INFO">${current_ssh_connection_object} = index=41
host=10.30.170.206
alias=None
port=22
timeout=1 minute
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.757691" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.758390" 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-04-25T23:57:55.758105" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.758906" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:57:55.758617" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.759486" elapsed="0.000458"/>
</kw>
<msg time="2026-04-25T23:57:55.760127" level="INFO">${status} = PASS</msg>
<msg time="2026-04-25T23:57:55.760176" level="INFO">${old_connection_index} = 94</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.759124" elapsed="0.001077"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:55.761449" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.763056" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.762896" elapsed="0.000596">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.762182" elapsed="0.001399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.764615" elapsed="0.000130"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.763932" elapsed="0.000884"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-25T23:57:55.760507" elapsed="0.004390"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:55.760279" elapsed="0.004671"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.760260" elapsed="0.004715"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-25T23:57:55.766000" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.765487" elapsed="0.000575"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-25T23:57:55.766160" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:57:55.766329" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-25T23:57:55.765186" elapsed="0.001175"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.766528" elapsed="0.000481"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.767307" level="INFO">index=95
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-25T23:57:55.767190" 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-04-25T23:57:55.767583" elapsed="0.013989"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.782065" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-25T23:57:55.782915" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.781753" elapsed="0.001534">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-25T23:57:55.788112" elapsed="0.000154"/>
</kw>
<msg time="2026-04-25T23:57:55.788339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.787079" elapsed="0.001383"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.789016" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.789326" elapsed="0.000063"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-25T23:57:55.784132" elapsed="0.005367"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-25T23:57:55.783575" elapsed="0.005975"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.756922" elapsed="0.032712">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.790035" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-25T23:57:55.790113" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-25T23:57:55.741228" elapsed="0.048992">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</status>
</kw>
<msg time="2026-04-25T23:57:55.790329" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-25T23:57:55.790373" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.206</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.736427" elapsed="0.053969"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-25T23:57:55.790785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:57:55.790506" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.790458" elapsed="0.000405"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-25T23:57:55.736286" elapsed="0.054600"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-25T23:57:55.736112" elapsed="0.054804"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-25T23:57:55.733880" elapsed="0.057092"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-25T23:57:55.727059" elapsed="0.063969"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-25T23:57:55.726595" elapsed="0.064475"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-25T23:57:52.205544" elapsed="3.585577"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.791981" level="INFO">${tmp} = {}</msg>
<var>${tmp}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:57:55.791698" elapsed="0.000310"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:55.796096" 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-04-25T23:57:55.792166" elapsed="0.003977"/>
</kw>
<if>
<branch type="IF" condition="${create_session_for_templated_requests}">
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:57:55.800604" level="INFO">Creating Session using : alias=default, url=http://10.30.170.206:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7c1dfccecd10&gt;, timeout=2, proxies=None, verify=False,                     debug=0 </msg>
<arg>default</arg>
<arg>url=${url}</arg>
<arg>auth=${auth}</arg>
<arg>timeout=${timeout}</arg>
<arg>max_retries=${max_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-25T23:57:55.800234" elapsed="0.000576"/>
</kw>
<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="PASS" start="2026-04-25T23:57:55.799801" elapsed="0.001079"/>
</kw>
<status status="PASS" start="2026-04-25T23:57:55.796216" elapsed="0.004697"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:55.796197" elapsed="0.004742"/>
</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-04-25T23:57:55.806357" level="INFO">${odl_connection} = 96</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-04-25T23:57:55.805953" 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-04-25T23:57:55.808151" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:55.808236" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:55.807859" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.808414" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:55.809670" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:56.127623" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:04 UTC 2026

  System load:  0.0                Processes:             127
  Usage of /:   10.7% of 77.35GB   Users logged in:       1
  Memory usage: 3%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Sat Apr 25 23:57:52 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:55.809334" elapsed="0.318433"/>
</kw>
<msg time="2026-04-25T23:57:56.127842" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.808944" elapsed="0.318974"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:55.807384" elapsed="0.320643"/>
</kw>
<msg time="2026-04-25T23:57:56.128083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:55.806962" elapsed="0.321170"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-25T23:57:55.806581" elapsed="0.321628"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-25T23:57:56.128261" elapsed="0.000044"/>
</return>
<msg time="2026-04-25T23:57:56.128477" level="INFO">${odl} = 96</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-04-25T23:57:55.805614" elapsed="0.322891"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.139416" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:57:56.150064" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/../../tools/deployment/search.sh' -&gt; '/home/jenkins//search.sh'</msg>
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-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-04-25T23:57:56.128734" elapsed="0.021424"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-25T23:57:56.150407" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-25T23:57:56.151137" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:57:56.150943" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-25T23:57:56.150911" elapsed="0.000315"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.158418" level="INFO">${tools_connection} = 97</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-25T23:57:56.157819" elapsed="0.000640"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:56.160466" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:56.160546" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:56.160184" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.160744" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.161953" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:56.466942" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:08 UTC 2026

  System load:  0.02               Processes:             111
  Usage of /:   20.9% of 38.58GB   Users logged in:       1
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

115 updates can be applied immediately.
94 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

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

New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Apr 25 23:57:10 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:56.161609" elapsed="0.305460"/>
</kw>
<msg time="2026-04-25T23:57:56.467148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.161246" elapsed="0.305980"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:56.159733" elapsed="0.307599"/>
</kw>
<msg time="2026-04-25T23:57:56.467386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.159274" elapsed="0.308160"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-25T23:57:56.158821" elapsed="0.308692"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-25T23:57:56.467566" elapsed="0.000045"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:57:56.157296" elapsed="0.310460"/>
</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-04-25T23:57:55.801232" elapsed="0.666589"/>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="PASS" start="2026-04-25T23:57:55.791408" elapsed="0.676468"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:57:56.468956" level="INFO">${device_type_passw} = full-uri-device</msg>
<var>${device_type_passw}</var>
<arg>"""${USE_NETCONF_CONNECTOR}""" == """True"""</arg>
<arg>default</arg>
<arg>${device_type_passw}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:57:56.468099" elapsed="0.000885"/>
</kw>
<kw name="Run Netopeer Docker Container">
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.474392" 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-04-25T23:57:56.473914" elapsed="0.000505"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-25T23:57:56.476142" level="INFO">Length is 0.</msg>
<msg time="2026-04-25T23:57:56.476221" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-25T23:57:56.475845" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.476400" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.477585" level="INFO">Logging into '10.30.171.48:22' as 'jenkins'.</msg>
<msg time="2026-04-25T23:57:56.776801" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Sat Apr 25 23:57:08 UTC 2026

  System load:  0.02               Processes:             111
  Usage of /:   20.9% of 38.58GB   Users logged in:       1
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.48
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

115 updates can be applied immediately.
94 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

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

New release '24.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sat Apr 25 23:57:56 2026 from 10.30.171.41
[?2004h[jenkins@releng-58418-84-1-docker-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-25T23:57:56.477265" elapsed="0.299712"/>
</kw>
<msg time="2026-04-25T23:57:56.777116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.476901" elapsed="0.300323"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-25T23:57:56.475390" elapsed="0.302072"/>
</kw>
<msg time="2026-04-25T23:57:56.777534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:57:56.474991" elapsed="0.302606"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-25T23:57:56.474614" elapsed="0.303109"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-25T23:57:56.777792" elapsed="0.000051"/>
</return>
<msg time="2026-04-25T23:57:56.778063" level="INFO">${netopeer_conn_id} = 98</msg>
<var>${netopeer_conn_id}</var>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-25T23:57:56.473546" elapsed="0.304552"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.788847" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-25T23:57:56.797879" level="INFO">'/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/sb-rsa-key.pub' -&gt; '/home/jenkins//sb-rsa-key.pub'</msg>
<arg>/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/sb-rsa-key.pub</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="PASS" start="2026-04-25T23:57:56.778379" elapsed="0.019641"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-25T23:57:56.798862" level="INFO">${netopeer_conn_id} = 98</msg>
<arg>${netopeer_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-25T23:57:56.798301" elapsed="0.000622"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:57:56.799571" level="INFO">Executing command 'docker run -dt -p 830:830 -v /home/jenkins/sb-rsa-key.pub:/home/netconf/.ssh/authorized_keys sysrepo/sysrepo-netopeer2:latest netopeer2-server -d -v 2'.</msg>
<msg time="2026-04-25T23:58:08.026600" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:58:08.027024" level="INFO">${stdout} = dd826f952db55fcf718c787882fabf60c74628032521510dac68e887eb12ae40</msg>
<msg time="2026-04-25T23:58:08.027131" level="INFO">${stderr} = Unable to find image 'sysrepo/sysrepo-netopeer2:latest' locally
latest: Pulling from sysrepo/sysrepo-netopeer2
399fb1102f3f: Pulling fs layer
d51af753c3d3: Pulling fs layer
fc878cd0a91c: Pulling fs la...</msg>
<msg time="2026-04-25T23:58:08.027229" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>docker run -dt -p ${netopeer_port}:830 -v /home/${TOOLS_SYSTEM_USER}/sb-rsa-key.pub:/home/${netopeer_username}/.ssh/authorized_keys ${netopeer_image} netopeer2-server -d -v 2</arg>
<arg>return_stdout=True</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-04-25T23:57:56.799148" elapsed="11.228139"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-25T23:58:08.028305" level="INFO">Executing command 'docker ps -a'.</msg>
<msg time="2026-04-25T23:58:08.095859" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-25T23:58:08.096216" level="INFO">${stdout} = CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS                  PORTS                                     NAMES
dd826f952db5   sysrepo/sysrepo-netope...</msg>
<msg time="2026-04-25T23:58:08.096324" level="INFO">${stderr} = </msg>
<msg time="2026-04-25T23:58:08.096416" level="INFO">${rc} = 0</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>docker ps -a</arg>
<arg>return_stdout=True</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-04-25T23:58:08.027817" elapsed="0.068650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.097751" level="INFO">CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS                  PORTS                                     NAMES
dd826f952db5   sysrepo/sysrepo-netopeer2:latest   "netopeer2-server -d…"   4 seconds ago   Up Less than a second   0.0.0.0:830-&gt;830/tcp, [::]:830-&gt;830/tcp   busy_lichterman</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.097034" elapsed="0.000841"/>
</kw>
<doc>Start a new docker container for netopeer server.</doc>
<status status="PASS" start="2026-04-25T23:57:56.469182" elapsed="11.628835"/>
</kw>
<kw name="Add Netconf Key">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.099942" level="INFO">${mapping} = {'DEVICE_KEY': 'device-key', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping}</var>
<arg>DEVICE_KEY=${netopeer_key}</arg>
<arg>RESTCONF_ROOT=${RESTCONF_ROOT}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.098910" elapsed="0.001094"/>
</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-04-25T23:58:08.138166" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.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-04-25T23:58:08.137779" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:58:08.139005" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth.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-04-25T23:58:08.138713" elapsed="0.000374">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth.titanium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-25T23:58:08.139183" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:58:08.138357" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.139784" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:58:08.139371" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:58:08.140190" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/location.uri"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:58:08.140361" level="INFO">${template} = $RESTCONF_ROOT/operations/netconf-keystore:add-keystore-entry
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:58:08.140047" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.140820" level="INFO">$RESTCONF_ROOT/operations/netconf-keystore:add-keystore-entry
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.140544" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.141939" level="INFO">mapping: {'DEVICE_KEY': 'device-key', 'RESTCONF_ROOT': '/restconf'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.141550" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.142416" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.142151" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.143371" 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-04-25T23:58:08.142848" elapsed="0.000550"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:58:08.144689" 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-04-25T23:58:08.144184" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:58:08.144919" elapsed="0.000038"/>
</return>
<msg time="2026-04-25T23:58:08.145195" 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-04-25T23:58:08.143617" elapsed="0.001605"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.145376" elapsed="0.000453"/>
</kw>
<var name="${key}">DEVICE_KEY</var>
<var name="${value}">device-key</var>
<status status="PASS" start="2026-04-25T23:58:08.142702" elapsed="0.003170"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.146636" level="INFO">${value} = /restconf</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-25T23:58:08.146122" elapsed="0.000556"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-25T23:58:08.147804" level="INFO">${encoded} = /restconf</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.147245" elapsed="0.000611"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-25T23:58:08.148051" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:58:08.148331" level="INFO">${encoded_value} = /restconf</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-25T23:58:08.146876" elapsed="0.001482"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.148550" elapsed="0.000512"/>
</kw>
<var name="${key}">RESTCONF_ROOT</var>
<var name="${value}">/restconf</var>
<status status="PASS" start="2026-04-25T23:58:08.145990" elapsed="0.003118"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-25T23:58:08.142499" elapsed="0.006643"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-25T23:58:08.149195" elapsed="0.000033"/>
</return>
<msg time="2026-04-25T23:58:08.149378" level="INFO">${mapping_to_use} = {'DEVICE_KEY': 'device-key', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-25T23:58:08.141250" elapsed="0.008161"/>
</kw>
<status status="PASS" start="2026-04-25T23:58:08.140944" elapsed="0.008501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.149647" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.149471" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-25T23:58:08.140919" elapsed="0.008832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.150538" level="INFO">${final_text} = /restconf/operations/netconf-keystore:add-keystore-entry</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:58:08.149916" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:58:08.150614" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:58:08.137173" elapsed="0.013585"/>
</kw>
<msg time="2026-04-25T23:58:08.150812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:58:08.124046" elapsed="0.026822"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.163691" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.176280" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.188811" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.189010" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.189184" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.189566" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.189419" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:58:08.189404" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.189828" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.189992" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.190154" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:58:08.189375" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.189262" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.190384" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.190461" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:58:08.190573" level="INFO">${uri} = /restconf/operations/netconf-keystore:add-keystore-entry</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, 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-04-25T23:58:08.119858" elapsed="0.070740"/>
</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-04-25T23:58:08.216104" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.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-04-25T23:58:08.215721" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:58:08.216874" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth.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-04-25T23:58:08.216626" elapsed="0.000319">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth.titanium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-04-25T23:58:08.217038" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:58:08.216292" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.217856" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/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-04-25T23:58:08.217262" elapsed="0.000627"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-25T23:58:08.218215" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/post_data.xml"&gt;/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-04-25T23:58:08.218381" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:netconf:keystore"&gt;
    &lt;key-credential&gt;
        &lt;key-id&gt;$DEVICE_KEY&lt;/key-id&gt;
        &lt;private-key&gt;-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-25T23:58:08.218070" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.218849" level="INFO">&lt;input xmlns="urn:opendaylight:netconf:keystore"&gt;
    &lt;key-credential&gt;
        &lt;key-id&gt;$DEVICE_KEY&lt;/key-id&gt;
        &lt;private-key&gt;-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-128-CBC,EA61FA90F5252AA4DB801B1A95907E08\n\ntKdknMpuxmKIwoD6KOlsChbRszafdHN7+Vzzn3gErAMnktW9NSeCTpWeHbgdIYsK8Wh2FH978JxdS9hCqzrLQ0e73zr1pMRYPLaVg4zJRLJhemk9LXLQ2xFgtE86kvnlSADbu9JooDyDTYRdRC3+ekU2t1J6mUord7FM8T3fFpQ9XBxL2DPrctqlQgLtxZ9e6JPN5H7ftxo4x8RxLtXLyvTiO1inKPkuqok+Q5QhKedEQZIUqmeCjhnbfgRP/cxFzP97luGP4qSsbieQVt4g0DjNteLu128a0VYHK1wX/UUvLkpWNaX2XZMSZzCiY5bWFFMIaq0nOdQvn4UImYMcK/hxlj2Qk0LR5GrY4fjuhsFHNnICx14FNY1GSoAuYS16/P9wNbcT7DG/10JxjjQz25RIjhLkqoFPenj6/HPPVih7Brm5Sfjhg+mSGF2lq+ccTKsq/XlaZ0MwtuqpuhQzvwNDjINBXQlnjLQVtYDImmz8qPOwRFvvuap6oAhErTeTdLNHUIO1eMFgRCUObN/B0VhgAWKqLCAj4fsbKQNQI55qD++YGhH0h+JmIsA8QbTapq+2108amdt7Cy9EtFJCXDka6VzgPEIZgoEnUkiYu9LXp2twPbZ+B4+Ls6ukbemSEgOMcWmFLCXs7dY5nVWiie8x7xHPiExKNqAK/HoY7K5WQaaANaA8XYq8xcg2zOljpXV3n0/Y5J0svLnf4nmdSEwso1UnanzV0fagMaGLxYz8jGt2Xpbzv7uUw7w2qL/DFNvVSUXj3yu/FulU/TuFM3KnNDHgHAidA/SFzvltvX+2rs+ZUYKbpsooR3vlWPDMXPnQm9mZ5MKei4KRom4DbEFEyVALua7QktRTkK2/TpD0euX6zV7PwAOHEAiJbCcr5EWkaAsZGAns9mh0iNEwz6tTuZeaM6ipEAUlZdAbtx/Cd3k+Il6SuehDWjyGHIguVCGfW6VrwCUepna/cNpt8PHLXTC0TQgonyyBi29N0Ha/ReC1MPOe0Xq/G62gojbU3IUh1NkzkAMw6ShDuIUdm0fjes8Lok7FnLBIhNHHCPHnr9cKDyKdSolgnxdDuEUdLJyeq9TQLPSCZAZKAuihHDLKyHPBh/8N/nAOLnEJvdKA1ledQt378GRg/GTALWwg7LTAuz4iwwbEWnfwZv+s/R2RQHsR38wzknMzsfBHBxiwe0Hg2a9wgBJKhQyXJYBIHJVqElrMEHWyg1Wwfvf34EYwMkDLg6Os54h2zj7bPKg+c5AUrir0ptuhPFPpqY9yvTBYrOPHH9/Y7kc4NRVfcWGeiThrHcAEpNFStWzvDY4c4GtIIdj5l2mQKG10r+pOoiCSzGlP1WPrqHA4jDhpOPkrqTsXwhQQH3k1hpRoiFoKMXw2bR3WU+0SC2SvZXlNNozdxjzvIDAsMHXqiPdq94XXgZWROulm1XI7dLE3oecBRorvs1M1EOQMLrNCCcckpzx6KP+P5tNjwCfj5CP+vLo+PcBPd8plbLv9MPtRtOYysR5g1L8DRFpkykV8DfQdl1xPWE37KRMCj66/OYQCU+WhlDqp1YZHrZ5FahmIm+dX9p7npvyDDd//9L+EfA7S\n-----END RSA PRIVATE KEY-----&lt;/private-key&gt;
        &lt;passphrase&gt;topsecret&lt;/passphrase&gt;
    &lt;/key-credential&gt;
&lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.218564" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-25T23:58:08.219289" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.218980" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.219850" level="INFO">${mapping_to_use} = {'DEVICE_KEY': 'device-key', 'RESTCONF_ROOT': '/restconf'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:58:08.219516" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-25T23:58:08.219372" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-25T23:58:08.218961" elapsed="0.000973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.220764" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:netconf:keystore"&gt;
    &lt;key-credential&gt;
        &lt;key-id&gt;device-key&lt;/key-id&gt;
        &lt;private-key&gt;-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-25T23:58:08.220079" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-25T23:58:08.220845" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="PASS" start="2026-04-25T23:58:08.215122" elapsed="0.005859"/>
</kw>
<msg time="2026-04-25T23:58:08.221045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-25T23:58:08.201883" elapsed="0.019209"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.233709" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.246290" 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-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth.titanium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.258911" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.259104" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.259284" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.259673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.259513" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:58:08.259498" elapsed="0.000255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.259891" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.260054" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.260226" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-25T23:58:08.259469" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.259363" elapsed="0.000944"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.260451" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.260525" elapsed="0.000016"/>
</return>
<msg time="2026-04-25T23:58:08.260691" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:netconf:keystore"&gt;
    &lt;key-credential&gt;
        &lt;key-id&gt;device-key&lt;/key-id&gt;
        &lt;private-key&gt;-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128...</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-04-25T23:58:08.201031" elapsed="0.059691"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-25T23:58:08.262010" level="FAIL">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.261743" elapsed="0.000333">File '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/variables/netconf/KeyAuth/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-25T23:58:08.262169" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-25T23:58:08.261358" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.262517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.262272" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.263081" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-25T23:58:08.262786" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-25T23:58:08.262597" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-25T23:58:08.262252" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.265844" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-25T23:58:08.263322" elapsed="0.002552"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-25T23:58:08.265931" elapsed="0.000032"/>
</return>
<msg time="2026-04-25T23:58:08.266100" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/suites/netconf/KeyAuth/../../../variables/netconf/KeyAuth/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-25T23:58:08.261061" elapsed="0.005066"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.267797" level="INFO">/restconf/operations/netconf-keystore:add-keystore-entry</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.267522" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.268306" level="INFO">&lt;input xmlns="urn:opendaylight:netconf:keystore"&gt;
    &lt;key-credential&gt;
        &lt;key-id&gt;device-key&lt;/key-id&gt;
        &lt;private-key&gt;-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,EA61FA90F5252AA4DB801B1A95907E08

tKdknMpuxmKIwoD6KOlsChbRszafdHN7+Vzzn3gErAMnktW9NSeCTpWeHbgdIYsK8Wh2FH978JxdS9hCqzrLQ0e73zr1pMRYPLaVg4zJRLJhemk9LXLQ2xFgtE86kvnlSADbu9JooDyDTYRdRC3+ekU2t1J6mUord7FM8T3fFpQ9XBxL2DPrctqlQgLtxZ9e6JPN5H7ftxo4x8RxLtXLyvTiO1inKPkuqok+Q5QhKedEQZIUqmeCjhnbfgRP/cxFzP97luGP4qSsbieQVt4g0DjNteLu128a0VYHK1wX/UUvLkpWNaX2XZMSZzCiY5bWFFMIaq0nOdQvn4UImYMcK/hxlj2Qk0LR5GrY4fjuhsFHNnICx14FNY1GSoAuYS16/P9wNbcT7DG/10JxjjQz25RIjhLkqoFPenj6/HPPVih7Brm5Sfjhg+mSGF2lq+ccTKsq/XlaZ0MwtuqpuhQzvwNDjINBXQlnjLQVtYDImmz8qPOwRFvvuap6oAhErTeTdLNHUIO1eMFgRCUObN/B0VhgAWKqLCAj4fsbKQNQI55qD++YGhH0h+JmIsA8QbTapq+2108amdt7Cy9EtFJCXDka6VzgPEIZgoEnUkiYu9LXp2twPbZ+B4+Ls6ukbemSEgOMcWmFLCXs7dY5nVWiie8x7xHPiExKNqAK/HoY7K5WQaaANaA8XYq8xcg2zOljpXV3n0/Y5J0svLnf4nmdSEwso1UnanzV0fagMaGLxYz8jGt2Xpbzv7uUw7w2qL/DFNvVSUXj3yu/FulU/TuFM3KnNDHgHAidA/SFzvltvX+2rs+ZUYKbpsooR3vlWPDMXPnQm9mZ5MKei4KRom4DbEFEyVALua7QktRTkK2/TpD0euX6zV7PwAOHEAiJbCcr5EWkaAsZGAns9mh0iNEwz6tTuZeaM6ipEAUlZdAbtx/Cd3k+Il6SuehDWjyGHIguVCGfW6VrwCUepna/cNpt8PHLXTC0TQgonyyBi29N0Ha/ReC1MPOe0Xq/G62gojbU3IUh1NkzkAMw6ShDuIUdm0fjes8Lok7FnLBIhNHHCPHnr9cKDyKdSolgnxdDuEUdLJyeq9TQLPSCZAZKAuihHDLKyHPBh/8N/nAOLnEJvdKA1ledQt378GRg/GTALWwg7LTAuz4iwwbEWnfwZv+s/R2RQHsR38wzknMzsfBHBxiwe0Hg2a9wgBJKhQyXJYBIHJVqElrMEHWyg1Wwfvf34EYwMkDLg6Os54h2zj7bPKg+c5AUrir0ptuhPFPpqY9yvTBYrOPHH9/Y7kc4NRVfcWGeiThrHcAEpNFStWzvDY4c4GtIIdj5l2mQKG10r+pOoiCSzGlP1WPrqHA4jDhpOPkrqTsXwhQQH3k1hpRoiFoKMXw2bR3WU+0SC2SvZXlNNozdxjzvIDAsMHXqiPdq94XXgZWROulm1XI7dLE3oecBRorvs1M1EOQMLrNCCcckpzx6KP+P5tNjwCfj5CP+vLo+PcBPd8plbLv9MPtRtOYysR5g1L8DRFpkykV8DfQdl1xPWE37KRMCj66/OYQCU+WhlDqp1YZHrZ5FahmIm+dX9p7npvyDDd//9L+EfA7S
-----END RSA PRIVATE KEY-----&lt;/private-key&gt;
        &lt;passphrase&gt;topsecret&lt;/passphrase&gt;
    &lt;/key-credential&gt;
&lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.268061" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.268792" 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-04-25T23:58:08.268527" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.269228" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-25T23:58:08.268986" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-25T23:58:08.270094" 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-04-25T23:58:08.269897" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-25T23:58:08.270457" 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-04-25T23:58:08.270273" elapsed="0.000211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-25T23:58:08.270634" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-25T23:58:08.271262" 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-04-25T23:58:08.271014" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-25T23:58:08.271349" elapsed="0.000036"/>
</return>
<msg time="2026-04-25T23:58:08.271514" 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-04-25T23:58:08.269484" elapsed="0.002055"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-25T23:58:08.278000" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.273870" elapsed="0.005864">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-25T23:58:08.271609" elapsed="0.008215">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.280053" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.279869" elapsed="0.000263"/>
</branch>
<status status="FAIL" start="2026-04-25T23:58:08.271591" elapsed="0.008572">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.280567" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.280750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-25T23:58:08.280703" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:58:08.280680" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-25T23:58:08.281019" elapsed="0.000065"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.281142" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.266496" elapsed="0.014759">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.281345" elapsed="0.000019"/>
</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-04-25T23:58:08.108486" elapsed="0.172961">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-25T23:58:08.281831" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-25T23:58:08.281607" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-25T23:58:08.281554" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-25T23:58:08.281979" elapsed="0.000017"/>
</return>
<arg>folder=${directory_with_keyauth_template}</arg>
<arg>mapping=${mapping}</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-04-25T23:58:08.100614" elapsed="0.181486">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Add Netconf Southbound key containing details about device private key and passphrase</doc>
<status status="FAIL" start="2026-04-25T23:58:08.098349" elapsed="0.183852">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Get the suite ready for callhome test cases.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.205267" elapsed="16.077020">ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<test id="s1-s7-s1-t1" name="Check_Device_Is_Not_Configured_At_Beginning" line="33">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.282360" elapsed="0.000690">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s7-s1-t2" name="Configure_Device_On_Netconf" line="37">
<doc>Make request to configure netconf netopeer with wrong password. Correct auth is netconf/netconf
ODL should connect to device using public key auth as password auth will fail.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.283308" elapsed="0.000816">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s7-s1-t3" name="Wait_For_Device_To_Become_Connected" line="44">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.284357" elapsed="0.000541">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s7-s1-t4" name="Deconfigure_Device_From_Netconf" line="48">
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<status status="FAIL" start="2026-04-25T23:58:08.285125" elapsed="0.000598">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s7-s1-t5" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="53">
<doc>Check that the device is really going to be gone. Fail
if found after one minute. This is an expected behavior as the
delete request is sent to the config subsystem which then triggers
asynchronous destruction of the netconf connector referring to the
device and the device's data. This test makes sure this
asynchronous operation does not take unreasonable amount of time
by making sure that both the netconf connector and the device's
data is gone before reporting success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-25T23:58:08.285961" elapsed="0.001632">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<kw name="Suite Teardown" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-25T23:58:08.289024" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-25T23:58:08.288913" elapsed="0.000220"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-25T23:58:08.289338" elapsed="0.000648"/>
</kw>
<doc>Tearing down the setup.</doc>
<status status="PASS" start="2026-04-25T23:58:08.288262" elapsed="0.001808"/>
</kw>
<doc>Test suite to verify the device mount using public key based auth.</doc>
<status status="FAIL" start="2026-04-25T23:57:52.126322" elapsed="16.163791">Suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.206', port=8182): Max retries exceeded with url: /restconf/operations/netconf-keystore:add-keystore-entry (Caused by NewConnectionError("HTTPConnection(host='10.30.170.206', port=8182): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</suite>
<status status="FAIL" start="2026-04-25T23:57:52.125056" elapsed="16.166254"/>
</suite>
<status status="FAIL" start="2026-04-25T23:13:41.615304" elapsed="2666.678747"/>
</suite>
<statistics>
<total>
<stat pass="3" fail="135" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="31" skip="0">critical</stat>
<stat pass="0" fail="3" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=4455</stat>
<stat pass="0" fail="1" skip="0">https://bugs.opendaylight.org/show_bug.cgi?id=7791</stat>
</tag>
<suite>
<stat name="netconf-gate-userfeatures-netty.txt" id="s1" pass="3" fail="135" skip="0">netconf-gate-userfeatures-netty.txt</stat>
<stat name="Ready" id="s1-s1" pass="0" fail="6" skip="0">netconf-gate-userfeatures-netty.txt.Ready</stat>
<stat name="Netconfready" id="s1-s1-s1" pass="0" fail="6" skip="0">netconf-gate-userfeatures-netty.txt.Ready.Netconfready</stat>
<stat name="Apidocs" id="s1-s2" pass="0" fail="1" skip="0">netconf-gate-userfeatures-netty.txt.Apidocs</stat>
<stat name="Apidocs" id="s1-s2-s1" pass="0" fail="1" skip="0">netconf-gate-userfeatures-netty.txt.Apidocs.Apidocs</stat>
<stat name="MDSAL" id="s1-s3" pass="1" fail="48" skip="0">netconf-gate-userfeatures-netty.txt.MDSAL</stat>
<stat name="Northbound" id="s1-s3-s1" pass="1" fail="48" skip="0">netconf-gate-userfeatures-netty.txt.MDSAL.Northbound</stat>
<stat name="CRUD" id="s1-s4" pass="2" fail="56" skip="0">netconf-gate-userfeatures-netty.txt.CRUD</stat>
<stat name="CRUD-RPC" id="s1-s4-s1" pass="1" fail="28" skip="0">netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC</stat>
<stat name="CRUD" id="s1-s4-s2" pass="1" fail="28" skip="0">netconf-gate-userfeatures-netty.txt.CRUD.CRUD</stat>
<stat name="CRUD-ACTION" id="s1-s5" pass="0" fail="11" skip="0">netconf-gate-userfeatures-netty.txt.CRUD-ACTION</stat>
<stat name="CRUD-ACTION" id="s1-s5-s1" pass="0" fail="11" skip="0">netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION</stat>
<stat name="Notifications" id="s1-s6" pass="0" fail="8" skip="0">netconf-gate-userfeatures-netty.txt.Notifications</stat>
<stat name="Notifications Basic" id="s1-s6-s1" pass="0" fail="8" skip="0">netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic</stat>
<stat name="KeyAuth" id="s1-s7" pass="0" fail="5" skip="0">netconf-gate-userfeatures-netty.txt.KeyAuth</stat>
<stat name="Keyauth" id="s1-s7-s1" pass="0" fail="5" skip="0">netconf-gate-userfeatures-netty.txt.KeyAuth.Keyauth</stat>
</suite>
</statistics>
<errors>
<msg time="2026-04-25T23:52:07.674947" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:52:07.676488" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:52:07.679110" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:52:07.679625" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:52:07.687646" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:52:07.688423" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.242539" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.244535" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.246547" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.247102" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.255378" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:54:41.256193" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-gate-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.194143" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.196828" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.199154" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.199685" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.207718" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:04.208480" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-gate-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.375110" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.376849" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.377568" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.388550" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.390104" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-25T23:57:48.392069" level="WARN">Error in file '/w/workspace/netconf-csit-1node-gate-userfeatures-netty-all-titanium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-gate-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
